[AJAX] Validation de form en ajax : captcha non reconnu

Discussion dans 'Développement d'un site Web ou d'une appli mobile' créé par CW76, 21 Juin 2011.

  1. CW76
    CW76 Nouveau WRInaute
    Inscrit:
    16 Janvier 2011
    Messages:
    12
    J'aime reçus:
    0
    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 :
    Code:
    <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:
    <?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:
    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:
    <?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
    @+
     
  2. spout
    spout WRInaute accro
    Inscrit:
    14 Mai 2003
    Messages:
    9 181
    J'aime reçus:
    351
    Je ne vois pas de session_start() dans ce fichier ?
     
  3. Eric 2A
    Eric 2A WRInaute discret
    Inscrit:
    26 Février 2006
    Messages:
    155
    J'aime reçus:
    0
    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...
    Code:
    else if ( ($_POST['antispam']=="") || (is_null($_POST['antispam'])) || (empty($_POST['antispam'])) ) {
    Code:
    <input type="text" name="antispam" id="antispam" size="10" />
    ou...
    Code:
    else if ( ($_POST['captcha']=="") || (is_null($_POST['captcha'])) || (empty($_POST['captcha'])) ) {
    Code:
    <input type="text" name="captcha" id="captcha" size="10" />
     
  4. CW76
    CW76 Nouveau WRInaute
    Inscrit:
    16 Janvier 2011
    Messages:
    12
    J'aime reçus:
    0
    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
    @+
     
  5. YoyoS
    YoyoS WRInaute accro
    Inscrit:
    14 Septembre 2006
    Messages:
    3 226
    J'aime reçus:
    0
    Sinon tu fais un formulaire construit en javascript only sans captcha. A pas de spam et tu fais pas chier tes visiteurs :D C'est ti pas bo ?
     
  6. MikeR
    MikeR WRInaute passionné
    Inscrit:
    9 Janvier 2010
    Messages:
    1 401
    J'aime reçus:
    0
    Bonsoir,
    il me semble que ton AJAX renvoie au serveur :
    Code:
    code_captcha
    qui est égal à
    Code:
    document.getElementById('antispam').value;
    c'est à dire la chaine de cararctère entrée par l'utilisateur.
    Et tu fais la comparaison suivante :
    Code:
    ( md5(strtoupper($_POST['captcha']))!=$_SESSION['antispam'] )
    alors que on a :
    Code:
    $_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:
    $_SESSION['antispam'] = md5(strtoupper($theCode));
     
  7. CW76
    CW76 Nouveau WRInaute
    Inscrit:
    16 Janvier 2011
    Messages:
    12
    J'aime reçus:
    0
    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 :
    Code:
    $(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 @+
     
Chargement...
Similar Threads - [AJAX] Validation ajax Forum Date
[Ajax] Appel fichier externe et sessions Développement d'un site Web ou d'une appli mobile 17 Juillet 2012
[AJAX] tester la présence d'un fichier distant Développement d'un site Web ou d'une appli mobile 17 Août 2011
[Ajax] modifier un lien image Développement d'un site Web ou d'une appli mobile 26 Novembre 2008
[ajax] Empêcher l'arrivée de données plus anciennes Développement d'un site Web ou d'une appli mobile 16 Septembre 2008
[AJAX] Menu accordéon 3 niveaux ! Développement d'un site Web ou d'une appli mobile 26 Août 2008
[Ajax] script post ou get ? précision Développement d'un site Web ou d'une appli mobile 11 Juin 2008
[Ajax] Formulaire et envoie $_POST Développement d'un site Web ou d'une appli mobile 5 Juin 2008
[AJAX] Comment gérer les header('location: '); Développement d'un site Web ou d'une appli mobile 2 Juillet 2007
[AJAX] Descendre la scroll d'une pseudo frame Développement d'un site Web ou d'une appli mobile 17 Avril 2007
Site à référencer [ajax] Débuter en référencement 10 Avril 2007
[AJAX] Rafraichir une page avec un bouton Développement d'un site Web ou d'une appli mobile 23 Mars 2007
[AJAX] Formulaire de connexion à phpBB Développement d'un site Web ou d'une appli mobile 16 Février 2007
[AJAX] ou [PHP & JAVASCRIPT] ? Développement d'un site Web ou d'une appli mobile 16 Septembre 2006
[AJAX] Spotback Développement d'un site Web ou d'une appli mobile 14 Septembre 2006
[RESOLU] [AJAX] réellement assynchrone ? Développement d'un site Web ou d'une appli mobile 10 Mars 2006
[Ajax] probleme de charset Développement d'un site Web ou d'une appli mobile 8 Mars 2006
Système de validation par SMS OTP Développement d'un site Web ou d'une appli mobile 30 Mai 2021
Validation site sans "www" sur Google search console ? Référencement Google 16 Janvier 2019
[Données structurées] Outil Testing tool > Problème de validation champ @id Référencement Google 31 Juillet 2017
Validation Schema.org Yandex et Google : résultat différent Débuter en référencement 3 Janvier 2017