[AJAX] Validation de form en ajax : captcha non reconnu
7 messages
• Page 1 sur 1
- CW76
- Nouveau WRInaute

- Messages: 13
- Inscription: 16 Jan 2011
[AJAX] Validation de form en ajax : captcha non reconnu
Bonjour à tous,
J'ai un formulaire dont les champs (adresse email et code antispam) sont validés en AJAX. La vérif du champ email se passe très bien...
Le problème est que, même si le code antispam recopié est conforme à l'image captcha affichée, ça me renvoie mon msg d'erreur "code incorrect".
Voilà le code du form :
Voici le code pour la génération du captcha :
Voici la fonction AJAX de validation du form :
Et enfin le fichier verif.php (appelé par AJAX) :
J'ai testé la valeur de $_SESSION['antispam'] mais celle n'est pas définie (!isset). Le pb vient donc de là, mais comment le résoudre, là je patauge complètement...
Merci beaucoup pour votre aide
@+
J'ai un formulaire dont les champs (adresse email et code antispam) sont validés en AJAX. La vérif du champ email se passe très bien...
Le problème est que, même si le code antispam recopié est conforme à l'image captcha affichée, ça me renvoie mon msg d'erreur "code incorrect".
Voilà le code du form :
- Code: Tout sélectionner
<div id="form">
<form method="post" action="" enctype="multipart/form-data" onsubmit="validForm();return false;">
<fieldset>
<label for="email">Adresse email :</label>
<input type="text" name="email" id="email" size="30" /><br />
<label for="antispam">Code anti-spam :</label>
<a onclick="actualiserCaptcha();" title="Si ce code vous parait illisible, cliquez sur l'image pour le changer...">
<img src="antispam.php" id="img_antispam" />
</a>
<input type="text" id="antispam" size="10" />
<input type="submit" id="confirmation" value="OK" />
</fieldset>
</form>
</div>
Voici le code pour la génération du captcha :
- Code: Tout sélectionner
<?php
session_start();
if ( !defined('ABSPATH') ) define('ABSPATH', dirname(__FILE__) . '/');
function getCode($length) {
$chars = '23456789ABCDEFGHJKLMNPQRSTUVWXYZ';
$rand_str = '';
for ($i=0; $i<$length; $i++) {
$rand_str .= $chars{ mt_rand( 0, strlen($chars)-1 ) };
}
return $rand_str;
}
$theCode = getCode(5);
$_SESSION['antispam'] = md5($theCode);
$char1 = substr($theCode,0,1);
$char2 = substr($theCode,1,1);
$char3 = substr($theCode,2,1);
$char4 = substr($theCode,3,1);
$char5 = substr($theCode,4,1);
$fonts = glob('rssrcs/polices/*.ttf');
$image = imagecreatefrompng('antispam.png');
$colors=array ( imagecolorallocate($image, 200,28,26),
imagecolorallocate($image, 44,184,193),
imagecolorallocate($image, 169,11,175),
imagecolorallocate($image, 252,161,3),
imagecolorallocate($image, 192,207,11) );
function random($tab) {
return $tab[array_rand($tab)];
}
imagettftext($image, 16, -10, 5, 25, random($colors), ABSPATH .'/'. random($fonts), $char1);
imagettftext($image, 19, 20, 25, 25, random($colors), ABSPATH .'/'. random($fonts), $char2);
imagettftext($image, 15, -35, 40, 25, random($colors), ABSPATH .'/'. random($fonts), $char3);
imagettftext($image, 17, 25, 60, 25, random($colors), ABSPATH .'/'. random($fonts), $char4);
imagettftext($image, 15, -15, 75, 25, random($colors), ABSPATH .'/'. random($fonts), $char5);
header('Content-Type: image/png');
imagepng($image);
imagedestroy($image);
?>
Voici la fonction AJAX de validation du form :
- Code: Tout sélectionner
function validForm() {
var xhr = null;
var donnees = "";
xhr = getXhr();
xhr.onreadystatechange = function(){
if(xhr.readyState == 4 && xhr.status == 200){
reponse = xhr.responseText;
document.getElementById('div_contenu').innerHTML = reponse;
}
}
xhr.open("POST","verif.php",true);
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
adr_email = document.getElementById('email').value;
code_captcha = document.getElementById('antispam').value;
donnees="adrEmail="+adr_email+"&captcha="+code_captcha;
xhr.send(donnees);
}
Et enfin le fichier verif.php (appelé par AJAX) :
- Code: Tout sélectionner
<?php
require "mesfonctions.php";
header('Content-Type: text/html; charset=utf-8');
echo '<div id="form">';
if ( ($_POST['adrEmail']=="") || (is_null($_POST['adrEmail'])) || (empty($_POST['adrEmail'])) ) {
echo '<h3>OUPS... Vous n\'avez pas saisi votre adresse email !</h3>
<form method="post" action="" enctype="multipart/form-data" onsubmit="validForm();return false;">
<fieldset>
<label for="email">Adresse email :</label><input type="text" name="email" id="email" size="30" onfocus="javascript:this.value=\'\'" value="Votre adresse email" /><br />
<label for="antispam">... Code anti-spam :</label><a onclick="actualiserCaptcha();" title="Si ce code vous parait illisible, cliquez sur l\'image pour le changer..."><img src="antispam.php" id="img_antispam" /></a>
<input type="text" name="antispam" id="antispam" size="10" />
<input type="submit" name="confirmation" id="confirmation" value="OK" />
</fieldset>
</form>';
}
else if (!verifEmail($_POST['adrEmail'])) {
echo '<h3>OUPS... L\'adresse email que vous avez saisie n\'est pas valide !</h3>
<form method="post" action="" enctype="multipart/form-data" onsubmit="validForm();return false;">
<fieldset>
<label for="email">Adresse email :</label><input type="text" name="email" id="email" size="30" onfocus="javascript:this.value=\'\'" value="Votre adresse email" /><br />
<label for="antispam">... Code anti-spam :</label><a onclick="actualiserCaptcha();" title="Si ce code vous parait illisible, cliquez sur l\'image pour le changer..."><img src="antispam.php" id="img_antispam" /></a>
<input type="text" name="antispam" id="antispam" size="10" />
<input type="submit" name="confirmation" id="confirmation" value="OK" />
</fieldset>
</form>';
}
else if ( ($_POST['captcha']=="") || (is_null($_POST['captcha'])) || (empty($_POST['captcha'])) ) {
$rappelEmail = $_POST['adrEmail'];
echo '<h3>OUPS... Vous n\'avez pas recopié le code anti-spam !</h3>
<form method="post" action="" enctype="multipart/form-data" onsubmit="validForm();return false;">
<fieldset>
<label for="email">Adresse email :</label><input type="text" name="email" id="email" size="30" onfocus="javascript:this.value=\'\'" value="'.$rappelEmail.'" /><br />
<label for="antispam">... Code anti-spam :</label><a onclick="actualiserCaptcha();" title="Si ce code vous parait illisible, cliquez sur l\'image pour le changer..."><img src="antispam.php" id="img_antispam" /></a>
<input type="text" name="antispam" id="antispam" size="10" />
<input type="submit" name="confirmation" id="confirmation" value="OK" />
</fieldset>
</form>';
}
else if ( md5(strtoupper($_POST['captcha']))!=$_SESSION['antispam'] ) {
$rappelEmail = $_POST['adrEmail'];
echo '<h3>OUPS... Le code anti-spam que vous avez recopié n\'est pas correct ! !</h3>
<form method="post" action="" enctype="multipart/form-data" onsubmit="validForm();return false;">
<fieldset>
<label for="email">Adresse email :</label><input type="text" name="email" id="email" size="30" onfocus="javascript:this.value=\'\'" value="'.$rappelEmail.'" /><br />
<label for="antispam">... Code anti-spam :</label><a onclick="actualiserCaptcha();" title="Si ce code vous parait illisible, cliquez sur l\'image pour le changer..."><img src="antispam.php" id="img_antispam" /></a>
<input type="text" name="antispam" id="antispam" size="10" />
<input type="submit" name="confirmation" id="confirmation" value="OK" />
</fieldset>
</form>';
}
else {
//script de traitement du form validé...
}
echo '</div>';
?>
J'ai testé la valeur de $_SESSION['antispam'] mais celle n'est pas définie (!isset). Le pb vient donc de là, mais comment le résoudre, là je patauge complètement...
Merci beaucoup pour votre aide
@+
-

Eric 2A - WRInaute discret

- Messages: 194
- Inscription: 26 Fév 2006
Re: [AJAX] Validation de form en ajax : captcha non reconnu
Salut,
Il y a un autre souci au niveau des variables.
Pour récupérer le code saisie, la variable $_POST['captcha'] est utilisée, alors que l'attribut du champ correspondant est soit absent (dans le formulaire principal) soit égal à "antispam" (dans la page verif.php).
Faire...
ou...
Il y a un autre souci au niveau des variables.
Pour récupérer le code saisie, la variable $_POST['captcha'] est utilisée, alors que l'attribut du champ correspondant est soit absent (dans le formulaire principal) soit égal à "antispam" (dans la page verif.php).
Faire...
- Code: Tout sélectionner
else if ( ($_POST['antispam']=="") || (is_null($_POST['antispam'])) || (empty($_POST['antispam'])) ) {
- Code: Tout sélectionner
<input type="text" name="antispam" id="antispam" size="10" />
ou...
- Code: Tout sélectionner
else if ( ($_POST['captcha']=="") || (is_null($_POST['captcha'])) || (empty($_POST['captcha'])) ) {
- Code: Tout sélectionner
<input type="text" name="captcha" id="captcha" size="10" />
- CW76
- Nouveau WRInaute

- Messages: 13
- Inscription: 16 Jan 2011
Re: [AJAX] Validation de form en ajax : captcha non reconnu
Merci pour votre aide !
Spout : session_start() est lancé au début de mon fichier php qui génère le captcha
Eric 2A : c'est vrai que c'est pas élégant de changer tout le temps de nom de variable, mais je ne crois pas que le souci vienne de là car : $_POST['antispam'] est récupéré sous le nom de variable, 'captcha' dans ma fonction AJAX, laquelle transmet cette variable en paramètre au fichier verif.php sous $_POST['code_captcha']... Je fais exactement la même chose avec le champ Email, et la variable passe impec du début à la fin.
Je continue de patauger ;-(
En tt cas merci
@+
Spout : session_start() est lancé au début de mon fichier php qui génère le captcha
Eric 2A : c'est vrai que c'est pas élégant de changer tout le temps de nom de variable, mais je ne crois pas que le souci vienne de là car : $_POST['antispam'] est récupéré sous le nom de variable, 'captcha' dans ma fonction AJAX, laquelle transmet cette variable en paramètre au fichier verif.php sous $_POST['code_captcha']... Je fais exactement la même chose avec le champ Email, et la variable passe impec du début à la fin.
Je continue de patauger ;-(
En tt cas merci
@+
-

MikeR - WRInaute impliqué

- Messages: 588
- Inscription: 9 Jan 2010
Re: [AJAX] Validation de form en ajax : captcha non reconnu
Bonsoir,
il me semble que ton AJAX renvoie au serveur :
c'est à dire la chaine de cararctère entrée par l'utilisateur.
Et tu fais la comparaison suivante :
alors que on a :
Moralité : d'un côté le md5 sur la chaine, de l'autre le md5 sur la chaine convertie en majuscules....
Solution : tu rajoutes un "strtoupper" dans le calcul de la référence :
il me semble que ton AJAX renvoie au serveur :
- Code: Tout sélectionner
code_captcha
- Code: Tout sélectionner
document.getElementById('antispam').value;
c'est à dire la chaine de cararctère entrée par l'utilisateur.
Et tu fais la comparaison suivante :
- Code: Tout sélectionner
( md5(strtoupper($_POST['captcha']))!=$_SESSION['antispam'] )
alors que on a :
- Code: Tout sélectionner
$_SESSION['antispam'] = md5($theCode);
Moralité : d'un côté le md5 sur la chaine, de l'autre le md5 sur la chaine convertie en majuscules....
Solution : tu rajoutes un "strtoupper" dans le calcul de la référence :
- Code: Tout sélectionner
$_SESSION['antispam'] = md5(strtoupper($theCode));
- CW76
- Nouveau WRInaute

- Messages: 13
- Inscription: 16 Jan 2011
Re: [AJAX] Validation de form en ajax : captcha non reconnu
Merci MikeR, mais non ça ne fonctionne pas plus avec ta suggestion (strtoupper).
Je pensais aussi qu'il y avait une sorte de conflit entre les variables, vu que la session et le champ où on tape le code captcha portaient le même nom "antispam"... C'est pas ça non plus !
J'ai testé l'existence de ma session : if (isset($_SESSION['antispam'])) {echo "true";} else {echo "false";} et ça me renvoie false, donc pas de session.
J'ai oublié de préciser une chose importante : j'ai un petit form rapide dans ma page index.php, dans lequel l'utilisateur entre son adresse email. Quand il soumet ce form, j'ai une fonction JQuery qui teste la syntaxe de l'email saisi, puis injecte mon fameux form email+captcha objet de mes soucis (dont le code html est contenu dans le fichier form_captcha.php) dans une div (ma_div) de ma page index.php :
Ce second form, une fois soumis, teste le captcha mais aussi teste plus en profondeur la validité de l'adresse (domaine valide etc.), vérification qui nécessite une action côté serveur.
C'est un brin compliqué, mais ça me permet d'avoir un mini-form dans ma page d'accueil (qui ne devait pas tenir trop de place), et si l'utilisateur entre son email, il arrive instantanément, sans rechargement de page, sur ce second form email+captcha qui lui permet de confirmer son action (en l'occurence son abonnement à une newsletter) après avoir vérifié l'email saisi et recopié le code captcha. J'ai fait de même avec le désabonnement : sur le même petit form rapide de la page d'accueil, j'ai aussi un bouton "désabonnement", qui affiche un autre second form qui sert de demande de confirmation de désabonnement.
Je pense donc qu'à cause de cette injection, dans index.php, du second form en JS (donc index.php n'est pas rechargée, mais c'est une contrainte que je dois respecter), ma session n'est pas créée. Par contre je n'ai aucun msg d'erreur quand mon code antispam.php est généré (création du captcha) et qui prévoit un session_start(). J'ai tenté de mettre ce session_start() en tête de mon fichier index.php, mais ça ne fonctionne pas plus...
Voilou...
Merci @+
Je pensais aussi qu'il y avait une sorte de conflit entre les variables, vu que la session et le champ où on tape le code captcha portaient le même nom "antispam"... C'est pas ça non plus !
J'ai testé l'existence de ma session : if (isset($_SESSION['antispam'])) {echo "true";} else {echo "false";} et ça me renvoie false, donc pas de session.
J'ai oublié de préciser une chose importante : j'ai un petit form rapide dans ma page index.php, dans lequel l'utilisateur entre son adresse email. Quand il soumet ce form, j'ai une fonction JQuery qui teste la syntaxe de l'email saisi, puis injecte mon fameux form email+captcha objet de mes soucis (dont le code html est contenu dans le fichier form_captcha.php) dans une div (ma_div) de ma page index.php :
- Code: Tout sélectionner
$(document).ready(function () {
$("#bouton_form").click(function() {
var adresse_email = $('#email').attr('value');
if (adresse_email == "") {
alert('Vous n\'avez pas saisi votre adresse email !');
}
else if (!verifSyntaxeEmail(adresse_email)) {
alert('L\'adresse email saisie n\'a pas un format valide !');
}
else {
changeContenu(form_captcha.php?adr='+adresse_email,'ma_div');
}
return false;
});
});
Ce second form, une fois soumis, teste le captcha mais aussi teste plus en profondeur la validité de l'adresse (domaine valide etc.), vérification qui nécessite une action côté serveur.
C'est un brin compliqué, mais ça me permet d'avoir un mini-form dans ma page d'accueil (qui ne devait pas tenir trop de place), et si l'utilisateur entre son email, il arrive instantanément, sans rechargement de page, sur ce second form email+captcha qui lui permet de confirmer son action (en l'occurence son abonnement à une newsletter) après avoir vérifié l'email saisi et recopié le code captcha. J'ai fait de même avec le désabonnement : sur le même petit form rapide de la page d'accueil, j'ai aussi un bouton "désabonnement", qui affiche un autre second form qui sert de demande de confirmation de désabonnement.
Je pense donc qu'à cause de cette injection, dans index.php, du second form en JS (donc index.php n'est pas rechargée, mais c'est une contrainte que je dois respecter), ma session n'est pas créée. Par contre je n'ai aucun msg d'erreur quand mon code antispam.php est généré (création du captcha) et qui prévoit un session_start(). J'ai tenté de mettre ce session_start() en tête de mon fichier index.php, mais ça ne fonctionne pas plus...
Voilou...
Merci @+
7 messages
• Page 1 sur 1
Lectures recommandées sur ce thème :
Consultez la description détaillée des produits ou services de Google suivants : Google Web Toolkit, Google API
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités


