|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Membre du Club
![]() Inscription : mars 2004 Messages : 57 ![]() |
Bonjour tout le monde,
J'ai écrit un script (test.php) pour générer un code aléatoire qui s'affiche dans une image afin d'empêcher des robots de s'inscrire dans un espace membres. Dans un premier temps je génère un code aléatoire, puis je le crypte avec la fonction mycrypt. Après cela j'affiche l'image générée par un autre script (image.php) en lui passant en paramètres le code crypté. Ce script va décrypter le code transmis en paramètres en utilisant la clé qu'il a en commun avec le premier script. Cela marche, mais de temps en temps (1 fois sur dix ou 1 fois sur vingt) au lieu d'avoir mon code généré j'ai sur mon image une chaîne de caractères qui n'a rien à voir avec mon code généré. Je ne comprends pas d'où vient cette erreur. Pourriez vous m'aider? le lien vers le script en ligne : http://brumespourpres.online.fr/test.php Le code : Code :
Code :
|
||||
|
|
00
|
|
|
#2 |
|
Membre du Club
![]() Inscription : mars 2004 Messages : 57 ![]() |
Je pense qu'il y a de temps en temps une erreur au niveau du décryptage (le texte crypté est mal passé en paramètres par exemple), je ne sais pas si quelqu'un si connaît dans se domaine?
|
|
|
00
|
|
|
#3 |
|
Expert Confirmé Sénior
![]() Mathias GaunardIngénieur développement logiciels Inscription : décembre 2003 Messages : 3 543 ![]() |
Ça sent le problème de slashes...
Vire les addslashes et stripslashes. Vire les serialize et unserialize. Dans image.php, détecte si magic_quotes_gpc est activé et si c'est le cas effectue un stripslashes récursivement sur $_GET, $_POST, $_COOKIE et $_REQUEST (il faut faire ça dans tous les scripts, à cause de cette directive anti-injection SQL pour newbie) |
|
|
00
|
|
|
#4 |
|
Expert Confirmé
![]() |
Salut!
J'ai intégré cette fonction dans l'espace membre que nous avons développé : http://www.developpez.net/forums/viewtopic.php?t=220791 Voici ce que ça donne : http://espm.gotdns.org/inscript.php Voici les sources : http://sub0.developpez.com/php/espmem_v2.zip Dans le fichier function.php, les fonctions CodeImage & CodeImageSupr. Dans le fichier unitform.php, tu trouveras le code d'affichage du formulaire (la fonction View_Form_Inscription). Dans le fichier config.php, les options du programme... à+ |
|
|
00
|
|
|
#5 | ||||
|
Membre du Club
![]() Inscription : mars 2004 Messages : 57 ![]() |
Merci à tous les deux pour vos réponses.
En partant sur ton idée loufoque j'ai trouvé la solution. Apparement la fonction base64_encode() est plus adpatée à ce que je voulais faire. Maintenant ça marche nickel. J'ai ajouté deux traits aléatoires et j'ai corrigé quelques erreurs en regardant le code de sub0. Je donne le code corrigé pour ceux qui seraient interessés : Code :
Code :
|
||||
|
|
00
|
|
|
#6 |
|
Membre du Club
![]() Inscription : mars 2004 Messages : 57 ![]() |
Après réflexion le code ne me parait pas très judicieux.
N'importe qui peut envoyer du texte crypté par l'url et recopier ce qu'affiche l'image générée... et à partir de là en déduire la clé. Je crois que le seul moyen sûr d'envoyer ce code au script générateur d’image va être d'utiliser les sessions. Il va donc falloir que je crée une image, moi qui ne voulais pas me prendre la tête sur les accès concurrents au fichier image c'est raté. |
|
|
00
|
|
|
#7 |
|
Expert Confirmé
![]() |
Effectivement, soit tu enregistres un code dans une session, soit tu utilises le code pour créer le nom du fichier image en admettant que tu crées un fichier et de cette manière, mémoriser le code à entrer... D'autres solutions peuvent-être envisagées, mais l'utilisation de session reste le plus efficace je pense, à+
|
|
|
00
|
|
|
#8 |
|
Membre du Club
![]() Inscription : mars 2004 Messages : 57 ![]() |
Salut sub0,
J'ai regardé ton code et à un moment il y a quelque chose que je trouve bizarre. Tu transmets (si j'ai bien compris) le hash de ton code image par un "input hidden". Seulement ça c'est du HTML, et si j'ai juste normalement c'est le navigateur du client qui va envoyer cette valeur de façon "cachée" aux yeux de l'utilisateur. Mais là quelqu'un de malintentionné ne pourrait il pas mettre son propre hashcode et ainsi passer outre la copie du code graphique? |
|
|
00
|
|
|
#9 |
|
Expert Confirmé
![]() |
Oui, la protection contre les robots a une faille de sécurité !
D'ailleurs, je vous remercie de l'avoir remarqué. ![]() Je vois 2 ou 3 solutions pour résoudre ce petit problème : • Soit sauvegarder le code aléatoire dans les variables globales ou de sessions. • Soit nomer le fichier de l'image avec le hash du code. Notez qu'à chaque fois que la fonction de génération de l'image est appellée, elle supprime du dossier temporaire, toutes les images plus veilles de 10 minutes. Ainsi, il n'ya pas de risques de saturation du dossier, et il n'ya pas de problème de fichier supprimé trop tôt non plus. En utilisant le hash pour nommer le fichier jpeg, même si l'utilisateur peut récupèrer le nom de l'image en regardant les propriétés, il ne pourra pas obtenir le code en clair. • Noter également, qu'il serait bien vu d'ajouter un grain de sel au hash. Mais l'utilisateur pourrait arriver à le calculer étant donner qu'on lui fournit le mot de passe en clair dans l'image et le mot de passe hashé dans le champs caché du formulaire... Pour avoir un grain de sel efficace, il faudrait enregistrer une variable sur le serveur afin que le grain de sel ne soit pas constant... Mais cela revient finalement au même que la 1ère solution dans ce cas. • Ou bien un mix des 3 solutions citées... Il conviendrait également de limiter le nombre d'inscription pour une IP, de détecter les adresses mails et les logins générés au hasard... A ce propos, l'espace membre dispose d'une fonction administrateur pour supprimer de la base de données les comptes non activés. En effet, un utilisateur dispose de 2 heures (durée réglable) pour activer son compte et ainsi valider son adresse mail. à+ |
|
|
00
|
|
|
#10 | |||
|
Membre du Club
![]() Inscription : mars 2004 Messages : 57 ![]() |
Citation:
Citation:
Citation:
Ce que je ferai : - Generation du code aléatoire. - Enregistrement dans la session du code. - Lock du fichier image. - Création du fichier image. - Affichage du formulaire. - Affichage de l'image. - Delock du fichier. Récupération des données du formulaire : - Récupération des données de la session. - Destruction de la session. - Tests de validité de l'inscription (code conforme, nombre de caractères du login, conformation mot de passe.....) |
|||
|
|
00
|
|
|
#11 | |||
|
Expert Confirmé
![]() |
Citation:
Citation:
Perso, je ne miserais pas tout sur les variables de sessions. Selon moi, la méthode avec le nom du fichier me semble être la meilleure solution, à+ |
|||
|
|
00
|
|
|
#12 |
|
Membre du Club
![]() Inscription : mars 2004 Messages : 57 ![]() |
L'avantage que je trouve à ta méthode c'est effectivement d'éviter le lock, donc si 10 personnes viennent s'inscrire en même temps elles peuvent être satisfaites rapidement ce qui est un bon point.
Mais au niveau de la sécurité je me demande s'il n'y a pas encore un problème. Imagine que je vienne m'inscrire sur ta page d'inscription, je relève le code image et je note la date que tu passes dans ton hidden. Ensuite avec un robot je peux redonner cette même date et vu que j'ai relevé manuellement le code image je sais lequel lui est associé. Je vais donc pouvoir m'enregistrer autant de fois que je veux pendant 10 min. ... sous réserve d'avoir bien compris tes explications. |
|
|
00
|
|
|
#13 |
|
Expert Confirmé
![]() |
Effectivement, tu as encore raison.
Dans ce cas, il suffit de supprimer le fichier lorsque l'inscription est acceptée. Bien vu! |
|
|
00
|
|
|
#14 | |||
|
Membre du Club
![]() Inscription : mars 2004 Messages : 57 ![]() |
Citation:
Mais il faudrait que j'ajoute un compteur pour éviter des choses aberrantes comme une IP qui a 100 comptes. Citation:
Citation:
|
|||
|
|
00
|
|
|
#15 | |
|
Membre du Club
![]() Inscription : mars 2004 Messages : 57 ![]() |
Citation:
Là ça doit effectivement fonctionner nickel. |
|
|
|
00
|
|
|
#16 | |
|
Expert Confirmé
![]() |
C'est vrai qu'il n'est pas évident de détecter le random... Cela risque de poser problèmes plus qu'autres choses. Mais il est tout de même possible de définir un niveau. Par exemple, le programme pourrait rechercher des syllabes (consone+voyelle). Certaines voyelles sont souvent côte à côte, exemples "eu", "ou", "ai"... Mais cela ne peux pas être utilisé pour rejeter une inscription. Il faut d'abord vérifier la syntaxe de l'émail, si le serveur existe et ensuite tester éventuellement la cohérence de l'adresse...
Citation:
|
|
|
|
00
|
|
|
#17 |
|
Expert Confirmé
![]() |
Si tu le permets (et comme le sujet semble résolu), je vais fusionner ce thread à la suite du post'it de l'espace membre. Tes remarques ont été très constructives, nous pouvons améliorer l'efficacité de l'image anti-robot. D'ailleurs, tu es le bienvenu sur ce thread si tu as d'autres suggestions sur le sujet!
http://www.developpez.net/forums/viewtopic.php?t=220791 Cordialement, Sub0 |
|
|
00
|
|
|
#18 | |
|
Membre du Club
![]() Inscription : mars 2004 Messages : 57 ![]() |
Citation:
J'essaye de faire un petit site en php mais étant hébergé par un hebergeur gratuit je n'ai pas le droit à grand chose donc pas de SSL à mon avis. Chez free on n'a même pas le droit à la fonction sleep(). Mais bon c'est gratuit... et puis je vais essayer de contourner ça avec une boucle while. :p |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com