[script] lutte anti spam

WRInaute passionné
voilà bien longtemps que je n'avais pas publié de script PHP... :oops:

L'objet de ce script est de protéger vos formulaires de contact par un code secret généré graphiquement à recopier dans un champ du formulaire afin d'éviter à des robots de vous bombarder de mails de spam.

La code secret, pour rester secret :wink: , est passé par variable de session.

Au début de votre page contenant le formulaire, inserez le code suivant:
Code:
<?php
     session_start();//ouverture d'une session
     $secret=""; //initialisation du code secret
     for($i=0;$i<5;$i++) { //génération du code secret à 5 caractères
          $secret.=chr(mt_rand(65, 90)); 
     }
     $_SESSION['secret'] = $secret;//stockage du code dans une variable de session
?>

Votre script de traitement de formulaire doit resembler à ceci
Code:
<?php
     session_start();
     if ($_POST['Secret']==$_SESSION['secret']) { // code secret valide

          votre code de traitement du formulaire

     } else { // code scret invalide

          votre code de traitement de code secret invalide

     }
     unset($_SESSION['secret']); // on detruit le code secret

     votre code de traitement de retour
?>

Enfin, le script de génération de code scret
Code:
<?php
	session_start();	//demarrage de la session
	$text=$_SESSION['secret']; //on récupére le code à générer
	header("Content-type: image/png"); //définition du type d'image générée (png)
	$im = imagecreatefromjpeg("secret.jpg");// Création de l'image à partir d'un fichier contenant le fond de l'image à générer
	$id = imagecreatefromjpeg("secret.jpg");// Création d'une deuxième image identique
	$grey = imagecolorallocate($im, 128, 128, 128); // définition de la couleur "gris"
	$black = imagecolorallocate($im, 0, 0, 0); // définition de la couleur "noir"
	$font = 'COURBD.TTF';// à remplacez le chemin par votre propre chemin de police TTF
	for($i=0;$i<5;$i++) {	//boucle de génération des 5 caractères du code secret
		$angle=mt_rand(10,30);	//définition d'un angle aléatoire entre 10 et 30 degrés
		if(mt_rand(0,1)==1) $angle=-$angle; //définition aléatoire du signe à appliquer à l'angle
		imagettftext($im, 14, $angle, 11+(20*$i), 21, $grey, $font, substr($text,$i,1));// génération de l'ombre d'un caractère du code secret en gris
		imagettftext($im, 14, $angle, 10+(20*$i), 20, $black, $font, substr($text,$i,1));// génération du caractère du code secret en noir
	}
	$id=imagerotate ( $id, 180,0 ); // on applique une rotation de 180° à notre deuxième image créée à partier de l'image de fond
	imagecopymerge ( $im, $id, 0, 0, 0, 0, 120, 30, 50 ); //on fusione cette image à notre code secret avec un facteur de tranparence de 50%
	imagepng($im); //notre code secret est terminé
	imagedestroy($im); //on libére nos ressources images
	imagedestroy($id);
?>

Je vous donne aussi l'image utilisée pour tramer le code secret dans cet exemple
secret.jpg


Voilà, c'est fini! :D

edit: pour faire plaisir à correiaj, ce script utilise la librairie GD2 disponible ici: http://www.boutell.com/gd/ :wink:
 
Nouveau WRInaute
Bonjour,

J'essaye d'utiliser votre script dans une de mes pages pour gérer les inscriptions des utilisateurs.
Cependant, je n'arrive pas à me servir du "script de génération de code secret".
Comment faut-il l'insérer ? Que retourne-t-il ?
Pour le moment, tout ce que j'obtiens c'est :

Code:
Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /home/www/nmaisons/inscriptions_secu/secret.php:1) in /home/www/nmaisons/inscriptions_secu/secret.php on line 2

Warning: Cannot modify header information - headers already sent by (output started at /home/www/nmaisons/inscriptions_secu/secret.php:1) in /home/www/nmaisons/inscriptions_secu/secret.php on line 4

Fatal error: Call to undefined function: imagecreatefromjpeg() in /home/www/nmaisons/inscriptions_secu/secret.php on line 5

Pourriez-vous m'aider ?

Cordialement.
 
WRInaute passionné
bonjour,

il semble que la session n'est pas déclarée au bon endroit!

pouvez-vous publier le code de la page qui provoque l'erreur?
 
Nouveau WRInaute
Je vais résumer un petit peu le contenu de mes pages pour vous montrer ce que ça donne...

Page formulaire.php :
Code:
<?php
     session_start();//ouverture d'une session
     $secret=""; //initialisation du code secret
     for($i=0;$i<5;$i++) { //génération du code secret à 5 caractères
          $secret.=chr(mt_rand(65, 90));
     }
     $_SESSION['secret'] = $secret;//stockage du code dans une variable de session

// Affichage du formulaire
include ("formulaire.html");
?>

Page formulaire.html :
A l'emplacement où je veux mettre l'image, faut-il que je mette directement le code ou faut-il que j'include un fichier contenant ce code ?
J'ai essayé d'include secret.php...

Page secret.php :
Code:
	<?php
   session_start();   //demarrage de la session
   $text=$_SESSION['secret']; //on récupére le code à générer
   header("Content-type: image/png"); //définition du type d'image générée (png)
   $im = imagecreatefromjpeg("secret.jpg");// Création de l'image à partir d'un fichier contenant le fond de l'image à générer
   $id = imagecreatefromjpeg("secret.jpg");// Création d'une deuxième image identique
   $grey = imagecolorallocate($im, 128, 128, 128); // définition de la couleur "gris"
   $black = imagecolorallocate($im, 0, 0, 0); // définition de la couleur "noir"
   $font = 'COURBD.TTF';// à remplacez le chemin par votre propre chemin de police TTF
   for($i=0;$i<5;$i++) {   //boucle de génération des 5 caractères du code secret
      $angle=mt_rand(10,30);   //définition d'un angle aléatoire entre 10 et 30 degrés
      if(mt_rand(0,1)==1) $angle=-$angle; //définition aléatoire du signe à appliquer à l'angle
      imagettftext($im, 14, $angle, 11+(20*$i), 21, $grey, $font, substr($text,$i,1));// génération de l'ombre d'un caractère du code secret en gris
      imagettftext($im, 14, $angle, 10+(20*$i), 20, $black, $font, substr($text,$i,1));// génération du caractère du code secret en noir
   }
   $id=imagerotate ( $id, 180,0 ); // on applique une rotation de 180° à notre deuxième image créée à partier de l'image de fond
   imagecopymerge ( $im, $id, 0, 0, 0, 0, 120, 30, 50 ); //on fusione cette image à notre code secret avec un facteur de tranparence de 50%
   imagepng($im); //notre code secret est terminé
   imagedestroy($im); //on libére nos ressources images
   imagedestroy($id);
	?>
 
WRInaute passionné
pour les deux erreurs suivantes:
Code:
Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /home/www/nmaisons/inscriptions_secu/secret.php:1) in /home/www/nmaisons/inscriptions_secu/secret.php on line 2 

Warning: Cannot modify header information - headers already sent by (output started at /home/www/nmaisons/inscriptions_secu/secret.php:1) in /home/www/nmaisons/inscriptions_secu/secret.php on line 4

Il faut que le script soit inseré en tout début de page avant toute instruction html ou php!

Pour cette erreur:
Code:
Fatal error: Call to undefined function: imagecreatefromjpeg() in /home/www/nmaisons/inscriptions_secu/secret.php on line 5

Le support JPEG n'est disponible que si PHP a été compilé avec GD-1.8 ou supérieur.
La fonction gd_info retourne des informations à propos de la bibliothèque GD installée.
Tu peux trouver la librairie GD et toutes les infos à cette adresse: http://www.boutell.com/gd/
 
Nouveau WRInaute
Bonjour,

Je vous remercie de votre aide.
Pour les erreurs de session et de header, c'est réglé.
Toutefois, j'ai toujours l'erreur suivante :
Code:
Fatal error: Call to undefined function: imagecreatefromjpeg() in /home/poudlard/www/nmaisons/inscriptions_secu/secret.php on line 3

Cependant, la librairie GD2 est installée sur mon serveur.
De plus, j'ai fais un include de mon fichier secret.php (celui où l'image est créée) au début de mon fichier pour le formulaire. L'image va s'insérer à cet endroit là, non ?
 
WRInaute discret
sebvita a dit:
Bonjour,

Je vous remercie de votre aide.
Pour les erreurs de session et de header, c'est réglé.
Toutefois, j'ai toujours l'erreur suivante :
Code:
Fatal error: Call to undefined function: imagecreatefromjpeg() in /home/poudlard/www/nmaisons/inscriptions_secu/secret.php on line 3

Cependant, la librairie GD2 est installée sur mon serveur.
si ça affiche ça c'est qu'elle est mal installé la librairie GD à mon avis

sinon il faut pas faire un include php, mais un img src html
 
WRInaute discret
Ce script est très simpathique, mais j'y verrais uen petite amélioration à faire :
Remplacer
if ($_POST['Secret']==$_SESSION['secret'])
Par
if (strtolower($_POST['secret'])==strtolower($_SESSION['secret']))

Je pense que ça peut éviter des confusions ;)
 
WRInaute discret
Pas besoin d'utiliser de variable de session, je ferai :


1-> Générer une chaine de caractère (exemple : abcdef)
2-> Générer le md5 de la chaine $K (exemple : f4sdq5f4sd54ffsd54f5)
3 -> Générer l'image contenant la chaine abcdef

Dans le formulaire :

on affiche l'image + la variable $K en hidden + un text input $I

Lors de la soumission on vérifie que :
md5($I)=$K

Thibaud
 
Discussions similaires
Haut