8796 sujets

Développement web côté serveur, CMS

Bonjour,

Je fais appel à vous concernant un soucis sur formulaire. J'ai utilisé un script de protection qui génère une image et permet d'éviter les spam de venir "pourrir" la boîte e-mail de l'amicale pour laquelle je travail.

Je l'avais utilisé sur l'ancienne version du site et cela fonctionnait bien.

code du script d'image de sécurité :



/************************* PRTOECTION ***********************************/

// on démarre une session pour pouvoir mémoriser le code
session_start();

// on définit les caractères utilisés pour le code généré
$liste = "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
// génére le code en piochant dans les caractères de la liste
$code = '';
while(strlen($code) != 6) {
   $code .= $liste[rand(0,36)];
}
// on mémorise le code de 6 caractères généré en session
$_SESSION['code']=$code;

// on créé une image de 70 x 20 pixels (larg x hauteur)
$img = imageCreate(70, 20) or die ("Problème de création GD");
// Choix de la couleur de fond, ici ça donne du Gris ( RVB)
$background_color = imagecolorallocate ($img, 238, 238, 238);
// Choix de la couleur de la police, ici du noir
$ecriture_color = imagecolorallocate ($img, 0, 0, 0);
// le code la police utilisée
$code_police=5;
// on créé une image jpeg en empêchant la mise en cache
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header("Content-type: image/jpeg");
// on introduit le code dans l'image
imageString($img, $code_police,(70-imageFontWidth($code_police) * strlen("".$code.""))/2,0, $code,$ecriture_color);
// on créé une image avec une qualité médiocre de 30%
// pour éviter qu'un robot puisse la lire
imagejpeg($img,'',30);
// on libère la mémoire
imageDestroy($img);	




Ce script est cencé mettre en Session, la variable 'code'

Hors, lorsque la page du formulaire de contact s'affiche, le code généré est différent du contenu de la variable dans $_SESSION. Un simple echo me l'a montré...

http://pompier-lemans.com/screen_contact.jpg

De plus, après validation du formulaire, la variable de session semble vide dans mon script d'envoi du mail.

J'ai remarqué un autre point, lors d'un rafraichissement, [F5], la nouvelle variable de session, contient le code de l'image d'avant. Smiley sweatdrop bizarre non ?

En terme de fonctionnement :

Une page qui contient le formulaire.

<div id="contactForm">
		<div class="loader"></div>
		<div class="bar"></div>
    <form action="mail.php" class="contactForm" id="contactForm" name="cform" method="post">
  
  		<h1>Contactez Nous</h1>				
  		<label>Votre message nous sera transmis et nous vous répondrons dans les meilleurs délais.</label>
  		<label class="grey" for="name">Nom:<span class="name-missing">Veuillez indiquer votre nom</span></label>
  		<input class="field" type="text" name="name" id="name" value="" size="23" />
  		<label class="grey" for="e-mail">Email:<span class="email-missing">E-mail valide requis</span></label>
  		<input class="field" type="text" name="email" id="e-mail" size="23" />
  		<label class="grey" for="message">Message:<span class="message-missing">Votre message est vide...</span></label>
  		<textarea class="field" rows="" cols="" id="message" name="message"></textarea>
  		<label for="verif">Recopiez le code suivant&nbsp;<img valign="bottom" src="imagesecu.php" alt="image de protection" /></label>
  		<input class="field" type="text" name="verif" id="verif" value="" maxlength="6" />
  		<input type="submit" name="submit" value="Envoyer" class="bt_register"/>
  		<? echo ">>>>>>>>>> ".$_SESSION['code'] ; ?>
  
		</form>	<!-- form : contactez nous -->
		<script src="js/scripts_contact.js" type="text/javascript" charset="iso-8859-1"></script>	
</div> <!-- contact form -->


Un script JS qui test les champs.

   // script de validation du message
  $('.contactForm').submit( function(){

		//statements to validate the form	
		var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
		var email = document.getElementById('e-mail');
		
		if (!filter.test(email.value)) {
			$('.email-missing').show();
		} else {$('.email-missing').hide();}
		if (document.cform.name.value == "") {
			$('.name-missing').show();
		} else {$('.name-missing').hide();}	
		if (document.cform.message.value == "") {
			$('.message-missing').show();
		} else {$('.message-missing').hide();}	
								
		if ((document.cform.name.value == "") || (!filter.test(email.value)) || (document.cform.message.value == "")) {
			return false;
		} 
			
		if ((document.cform.name.value != "") && (filter.test(email.value)) && (document.cform.message.value != "")) {
			
			// on cache le formulaire
			$('.contactForm').hide();
		
			// on montre la barre de chargement
			$('.loader').append($('.bar'));
			$('.bar').css({display:'block'});
		
			// envoi des requêtes ajax
			$.post('mail.php',{name:$('#name').val(),
							  email:$('#e-mail').val(),
							  message:$('#message').val(),
								verif:$('#verif').val()},
		
			// renvoi des données
			function(data){
			  // cache la barre de chargement
			  $('.bar').css({display:'none'});
			  $('.loader').append(data);
			});
					
			//Attente de 6s, fermeture du formulaire et fade out
			setTimeout('$(".loader").slideUp("slow")', 6000); 
			
			// on montre le formulaire
			$('.contactForm').show();
			
                      // on vide le formulaire
                       $('.contactForm')[0].reset();

			
			// on le fait rester sur la page après envoi
			return false;
		} 
  });



Si valide il envoi sur la page d'envoi de mail.

include("datefr.php");

if(!isset($_SESSION['code']) || strlen($_SESSION['code']) != 6) 
{
     
     echo ">> ".$_SESSION['code']." - ".$_POST['verif']." <<" ; 
     // pour les tests la session renvoi vide, vérif renvoi bien son contenu
     exit();
}


if($_SESSION['code'] != $_POST['verif']) 
{
   ...
}
else
{
   ...
}


Quelqu'un aurait il une idée du pourquoi la session renvoi un mauvais contenu et aussi pourquoi elle se trouve vide après passage sur l'autre script ? Smiley ohwell
Modifié par WuKoDLaK (06 Mar 2011 - 12:15)
Hello,

c'est normal que lorsque le formulaire s'affiche, la variable code contenu dans la session soit différente de celui de l'image : quand tu appelles l'image, tu génères systématiquement un nouveau code. Comme l'image est appelée après la page (logique, on charge d'abord la page, puis ses ressources), tu ne pourras afficher dans ton formulaire que la valeur précédente (CQFD).

Pour l'envoi du mail, et l'affichage de la variable de vérif, as-tu bien démarré la gestion des sessions avec session_start() en début de script ? Autrement, la session n'est pas chargée, et tu n'aura pas accès à la variable ...

Enfin - et c'est sans doute un autre débat - les captcha sont à proscrire : ils sont des freins à l'accessibilité, et les moteurs de spams savent de mieux en mieux les contourner ... bref, ils ne font que pourrir la vie des utilisateurs. Une solution antispam heuristique (comme akismet) est certainement préférable Smiley cligne

J'espère t'avoir aidé !
Bonsoir,

Merci de ta réponse, je vais aller vérifier quelques parties du code car je suis resté bloqué sur le fait que la valeur n'était pas la même dès le début du formulaire ! Smiley sweatdrop
Modifié par WuKoDLaK (06 Mar 2011 - 21:48)
Merci MAD's pour ton aide, je n'avais effectivement pas envisagé que l'image était généré à un autre moment que celui du chargement de la page. J'ai bien vu le souci mais ça ne me donnait rien.
Pour le session_start(); .... Smiley confused Smiley confused honte à moi, j'avais déjà tenté son utilisation mais ne trouvant pas la bonne solution, je l'avais retiré pensant qu'il était inutile.

seul hic restant, après validation et envoi du mail ou retour en erreur car code invalide, il me faut recharger la page pour pouvoir ré-écrire... le bouton submit, ne fait plus effet.