Système CAPTCHA

Résolu/Fermé
Utilisateur anonyme - 15 avril 2016 à 21:35
 Utilisateur anonyme - 16 avril 2016 à 20:38
Bonsoir,

Voilà, je souhaiterais créer un système de Captcha pour mon site web, lors de l'inscription.
L'inscription se fait sur la page index.php, qui est la page qui contient le formulaire mais également le code PHP qui affiche le résultat (enfin bref, tout se fait sur une seule page).
Voici mon problème (je l'ai organisé par étapes de problèmes survenus et les solutions que j'y ai apporté) :

J'ai donc déclaré deux variables ayant pour valeur
rand(0, 10);
pour choisir un nombre au hasard entre 0 et 10, puis je les ai additionnées pour stocker le résultat dans une variable
$captcha
par exemple.
Jusqu'ici tout va bien, je demande à l'utilisateur "Calculez $var1 + $var2" et il doit donner le résultat, ensuite un if vérifie si le résultat de l'utilisateur
$_POST['captcha']
est bien égal au résultat réel $captcha, sauf que, comme mon formulaire repointe sur la même page, la page s'actualise une fois le bouton appuyé, la valeur de
$_POST['captcha']
est imaginons 5, résultat de 3 + 2 sur la page. Sauf que quand la page s'actualise, les $var1 et $var2 changent, et donc $captcha change, donc au moment venu, sur le if, PHP va comparer la valeur
$_POST['captcha']
(égal à l'ancien $captcha avant que la page ne s'actualise) avec le nouveau
$captcha
qui sera forcément différent (j'éspère que j'ai été clair).

Donc je m'en suis rapidement rendu compte et j'ai ajouté un petit bout de code pour corriger ce soucis :
if(!isset($_POST['nom']) AND !isset($_POST['prenom']) AND !isset($_POST['email']) AND !isset($_POST['psw']) AND !isset($_POST['psw2']))
{
$captcha = $rn + $rn2;
}

(le formulaire contient les champs nom, prenom, email, mot de passe et confirmer mot de passe).
Ainsi,
$captcha
n'est calculé que si le formulaire est au départ vide (c'est à dire lorsqu'on arrive sur le site). Donc le
$captcha
sera calculé au tout début, puis quand l'utilisateur va remplir le formulaire, à l'actualisation, $captcha ne sera pas recalculé (puisque les variables nom, prenom etc contiennent quelque chose, voir le if que j'ai donné précédemment).

Me voila en face d'un autre problème : en effet, $captcha n'est pas recalculé, mais l'ancien
$captcha
(celui d'avant l'actualisation de la page) n'est pas retenu, donc
$captcha
ne vaut rien du tout, donc évidemment rien ne marche.
J'ai donc ouvert une session sur PHP, pour sauvegarder l'ancienne valeur de $captcha, mon code avec if devient :
if(!isset($_POST['nom']) AND !isset($_POST['prenom']) AND !isset($_POST['email']) AND !isset($_POST['psw']) AND !isset($_POST['psw2']))
{
$captcha = $rn + $rn2;
$_SESSION['captcha'] = $captcha;
}

Ainsi,
$captcha
est sauvegardé dans
$_SESSION['captcha']
et c'est
$_SESSION['captcha']
que j'utilise dans le code à la place de $captcha.
Ouf, tout marche enfin. Enfin presque... J'ai maintenant un nouveau problème :
Lorsque l'utilisateur arrive sur mon site, il est en face du formulaire et peut s'inscrire. Donc il s'inscrit normalement, le CAPTCHA fonctionne enfin et tout va bien. Mais voilà deux mises en situation :
S'il rate l'inscription (imaginons qu'il ne met pas deux fois le même mot de passe à la confirmation, ou il entre moins de 7 caractères pour le mot de passe etc.), mon code affiche un message d'erreur "il faut au moins 7 caractères...". Dans ce cas, l'utilisateur est amené à corriger son erreur, cependant lorsqu'il re recomplète le formulaire, le captcha affiché ne sera pas le même (heureusement me direz vous), mais lorsqu'il y répond, la valeur de
$_SESSION['captcha']
est toujours la même, puisque le formulaire reçu était plein (ou non entièrement vide) et donc $captcha n'a pas été recalculé ! Impossible pour l'utilisateur de s'inscrire.
C'est le même problème s'il réussi à s'inscrire du premier coup, mais qu'il décide d'inscrire un 2ème compte, allez savoir pourquoi, mais imaginons.

Notez que ce problème n'intervient pas si l'utilisateur reclique simplement sur "Accueil" pour revenir sur le site et ainsi vider le formulaire et recalculer
$_SESSION['captcha']
(puisque
$captcha
sera recalculé).

Quelqu'un peut-il m'aider à résoudre ce problème SVP ? Merci d'avoir lu.

1 réponse

Utilisateur anonyme
16 avril 2016 à 00:49
Bonjour

Il y a une manière bien simple d'éviter le problème, c'est d'ajouter un champ hidden qui contient la valeur attendue. Pas directement (encore que…) mais déguisée : par exemple le triple de la valeur, précédé d'un chiffre aléatoire et suivi de deux autres, ou toute autre cuisine à ta convenance. Tu es sûr que la valeur du champ hidden correspond bien au captcha qui était affiché, même en cas de saisie multiple ou de retour en arrière dans l'historique.
0
NHenry Messages postés 15164 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 27 novembre 2024 345
16 avril 2016 à 00:53
Quitte à afficher un champ caché, autant hashé ses données (MD5 ou SHA par exemple) comme ça tu peux limiter le risque de contournement.
0
Utilisateur anonyme > NHenry Messages postés 15164 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 27 novembre 2024
16 avril 2016 à 01:03
C'est vrai qu'un hachage suffit puisqu'on veut seulement vérifier, pas retrouver la valeur attendue. C'est plus simple à programmer, on utilise une fonction de PHP au lieu d'en ré-écrire une soi-même.
0
Bonjour,

Merci pour votre réponse, mais je crois que je n'ai pas trop bien compris... Du coup j'ai besoin d'ouvrir une session ?
Le $captcha est de toute façon recalculé à chaque fois non ? Donc la valeur attendue est toujours différente.

Je ne demande pas un code tout fait mais est-ce-que je pourrais juste avoir un petit exemple s'il vous plait ? Parce-que je ne vois pas trop...
0
NHenry Messages postés 15164 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 27 novembre 2024 345
16 avril 2016 à 15:10
Il faut contrôler 2 choses:
1) la saisie est-elle bien celle attendue ?
2) La saisie est-elle celle prévue ?

Car en mettant un champ caché avec une captcha à saisir, si tu ne fais pas de mémorisation de ton côté rien n'empêchera d'avoir un spammeur qui se contente juste de rejouer en permanence la même captcha sans que ton système ne le détecte.
0
Utilisateur anonyme
16 avril 2016 à 15:48
Donc je recommence à 0 ?

Concrétement, je ne vois pas trop quoi faire à part :
calculer la somme de deux variables choisies aléatoirement et présentées à l'utilisateur et vérifier si le résultat de l'utilisateur est bien égal à la somme de ces deux variables avec un if.
Comme je l'ai dit je rencontre des problèmes car ça ne marche pas comme je le voudrais.
0