[script] lutte anti spam

Consultez la formation au référencement naturel Google de WebRankInfo / Ranking Metrics


fandecine
Modérateur
Modérateur
 
Messages: 1640
Inscription: Sam Avr 02, 2005 14:58

[script] lutte anti spam

Message le Mar Nov 29, 2005 10:51

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: Tout sélectionner
<?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: Tout sélectionner
<?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: Tout sélectionner
<?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
Image

Voilà, c'est fini! :D

edit: pour faire plaisir à correiaj, ce script utilise la librairie GD2 disponible ici: http://www.boutell.com/gd/ :wink:
Dernière édition par fandecine le Mar Nov 29, 2005 12:35, édité 1 fois.


correiaj
WRInaute accro
WRInaute accro
 
Messages: 1106
Inscription: Lun Avr 25, 2005 22:39

Message le Mar Nov 29, 2005 12:27

Il serait bien de dire que cela nécessite les librairies gd2 de php...
Sinon, c´est sympa comme code ;-)

sebvita
Nouveau WRInaute
 
Messages: 3
Inscription: Mar Fév 28, 2006 8:53

Message le Mar Fév 28, 2006 8:59

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: Tout sélectionner
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.


fandecine
Modérateur
Modérateur
 
Messages: 1640
Inscription: Sam Avr 02, 2005 14:58

Message le Mar Fév 28, 2006 9:03

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?

sebvita
Nouveau WRInaute
 
Messages: 3
Inscription: Mar Fév 28, 2006 8:53

Message le Mar Fév 28, 2006 10:57

Je vais résumer un petit peu le contenu de mes pages pour vous montrer ce que ça donne...

Page formulaire.php :
Code: Tout sélectionner
<?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: Tout sélectionner
   <?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);
   ?>


fandecine
Modérateur
Modérateur
 
Messages: 1640
Inscription: Sam Avr 02, 2005 14:58

Message le Mar Fév 28, 2006 13:35

pour les deux erreurs suivantes:
Code: Tout sélectionner
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: Tout sélectionner
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/

sebvita
Nouveau WRInaute
 
Messages: 3
Inscription: Mar Fév 28, 2006 8:53

Message le Dim Mar 05, 2006 16:19

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: Tout sélectionner
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 ?

spijoelx
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 249
Inscription: Ven Fév 06, 2004 20:04

Message le Dim Mar 05, 2006 16:27

sebvita a écrit: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: Tout sélectionner
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


Bahanix
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 131
Inscription: Mar Juin 07, 2005 23:58

Message le Dim Mar 05, 2006 22:13

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 ;)

tiboel
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 116
Inscription: Dim Mar 21, 2004 15:36

Message le Lun Mar 27, 2006 12:06

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


Formation recommandée sur ce thème :

Formation Référencement naturel Google : apprenez une méthode efficace pour optimiser à fond le référencement naturel dans Google de façon durable... Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités