FrancaisAdobe Flex Tutorial
jeux flash gratuit
Les critiques des meilleurs sites de poker, comme Titan Poker, sont sur Launchpoker: lisez les attentivement avant de décider où aller jouer au Texas Holdem sur internet.

[Web] - Créer une image de vérification anti-spam pour formulaire


Tutorial - Comment faire une image de vérification pour protéger ses formulaires
image anti spam captcha

Votre site comporte sûrement des formulaires, que ce soit pour un formulaire de contact/d'inscription, un système de commentaire pour votre blog, un livre d'or, un forum...
Ces formulaires peuvent être la cible de robots de spam, qui envoient de manière automatique des publicités ou des liens.
Des hackers peuvent aussi le faire de manière massive pour crasher votre base de données voire votre serveur web.

Pour y remédier, il existe une solution simple que vous avez sûrement déjà vu sur de nombreux sites: une image de vérification aussi appelée captcha.
Cette image est cryptée et prouve que celui qui remplit le formulaire est bien humain.
Vous apprendrez avec ce tutorial à créer cette image et à effectuer la vérification de la valeur entrée.
Le code PHP est celui utilisé pour la vérification des ajouts de commentaires sur le blog Pixtiz.

Ce tutorial a été largement inspiré par un post du forum de notoon.fr.







Les éléments requis

Pour ce tutorial, vous aurez besoin de la librairie GD. Vérifier qu'elle est activée auprès de votre hébergeur ou avec un phpinfo().
La plupart des hébérgeurs payant ont cette librairie activée.

Pour pouvoir générer les caractères, vous devrez placer un police de caractères sur votre serveur, dans le même dossier que celui où vous placerez les fichiers PHP.

Choisissez une police lisible, le but ici n'est pas de gêner l'utilisateur avec des caractères incompréhensibles mais de brouiller les robots. Vous pouvez en uploader plusieurs pour plus de sécurité.
Pour Pixtiz, j'utilisé simplement la police arial.ttf. N'oubliez pas de renommer l'extension TTF en minuscule (ou modifiez le script PHP).

Placez aussi le fichier bruit.png qui servira à brouiller le fond de l'image.



Le fichier image.php qui va créer l'image de vérification

<?php
// On démarre une session
session_start();
/*
Pour créer une image, on envoie un en-tête avec la fonction header() 
pour dire au navigateur qu'on envoie une image
Lorsqu'on va appeler l'image avec <img src="..." /> on utlisera 
bien image.php et non bruit.png
*/
header("Content-Type: image/png");
/**
  mt_rand() génère un nombre aléatoire : cette fonction est 
  plus rapide que rand() de la bibliothèque standard
  sha1() renvoie une chaine cryptée de son paramètre. Elle est similaire 
  à md5() mais renvoie une chaine plus longue, la probabilité de 
  collision est donc réduite
  substr() retourne le segement d'une chaine. Dans notre cas on prend un segment 
  de 5 caractères en partant du caractère 0
  On stocke alors la chaine obtenue dans $rand_str
  */
  $rand_str = substr( sha1( mt_rand() ), 0, 5);
// On hash ensuite cette valeur avec md5() puis on stocke ce résultat 
  dans variable de session $_SESSION['valeur_image'] de la session en cours 
  $_SESSION['valeur_image'] = md5($rand_str);
// Afin de personnaliser chacun de nos caractères, on les stocke un 
  par un dans des variables
  $char1=substr($rand_str,0,1);
  $char2=substr($rand_str,1,1);
  $char3=substr($rand_str,2,1);
  $char4=substr($rand_str,3,1);
  $char5=substr($rand_str,4,1);
/*
  imagecreatefrompng() crée une nouvelle image PNG à partir d'un 
  fichier
  On la stocke dans $image pour pouvoir y mettre ensuite nos caractères
  */
  $image=imagecreatefrompng("bruit.png");
/*
  putenv() fixe la valeur de la variable d'environnement pour GD. Cette valeur 
  n'existera que durant la vie du script courant, et l'environnement initial sera 
  restauré lorsque le script sera terminé
  Cette ligne est utile si vous avez des problèmes lorsque la police de 
  caractère réside dans le même dossier que le script qui 
  l'utilise
  Remarquez que lorsqu'on utilisera les polices, il faudra enlever l'extension 
  .tff
  */
  putenv('GDFONTPATH=' . realpath('.'));
/*
  glob() retourne un tableau contenant les fichiers trouvés dans le dossier 
  avec l'extension .ttf
  Vous pouvez donc ajouter autant de police TTF que vous voulez
  */
  $files = glob("*.ttf");
/*
  Pour chaque nom de fichier trouvé, on retire l'extension .tff
  Et on l'ajoute au tableau $font[]
  */
  foreach ($files as $filename) {
  $filename = substr($filename,0,-4); // retire l'extension .tff
  $fonts[] = $filename; // ajoute les noms des polices sans leur extension dans 
  un tableau
  }
/*
  imagecolorallocate() retourne un identifiant de couleur
  On définit les couleurs RVB qu'on va utiliser pour nos polices et on 
  les stocke dans le tableau $colors[]
  Vous pouvez ajouter autant de couleurs que vous voulez
  */
  $colors = array(imagecolorallocate($image, 255,0,0), // rouge
  imagecolorallocate($image, 109,30,100), // violet
  imagecolorallocate($image, 30,80,180), // bleu
  imagecolorallocate($image, 40,100,20), // vert
  imagecolorallocate($image, 255,90,0), // orange
  imagecolorallocate($image, 130,130,130)); // gris
/*
  On crée la fonction aleatoire() qui va retourner une valeur prise au hasard dans un tableau
  Elle sera utilisée pour piocher une couleur et une police au hasard pour chaque caractère
  */
  function aleatoire($tab){
  $max = count($tab)-1;
  $hasard = mt_rand(0,$max);
  return ($tab[$hasard]);
  }
/*
  On met en forme nos caractères un par un pour les disposer sur notre 
  image d'origine bruit.png
  imagettftext(image, taille_de_la_police, angle, coordonnée_X_à_partir_du_bord, 
  coordonnée_Y_à_partir_du_bord, couleur_RVB, police_de_caractères, 
  texte) dessine un texte avec une police TrueType
  */
  imagettftext($image, 25, -10, 10, 35, aleatoire($colors), aleatoire($fonts), $char1);
  imagettftext($image, 25, 20, 40, 35, aleatoire($colors), aleatoire($fonts), $char2);
  imagettftext($image, 25, -35, 60, 35, aleatoire($colors), aleatoire($fonts), $char3);
  imagettftext($image, 25, 25, 100, 35, aleatoire($colors), aleatoire($fonts), $char4);
  imagettftext($image, 25, -15, 120, 35, aleatoire($colors), aleatoire($fonts), $char5);

  // imagepng() crée une image PNG en utilisant l'image $image
  imagepng($image);

  //L'image a été créée, on appelle donc imagedestroy() qui libère toute la mémoire associée à l'image $image
  imagedestroy($image);
  ?> 
  









La page form.php avec le fomulaire et la vérification

<?php
/** On démarre une session pour pouvoir récupérer le code généré */
session_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" 
/>
<title>Formulaire avec captcha</title>
</head>
<body>
  <?php
  /** Si le formulaire a été soumis */
  if(isset($_POST['submit'])) {
  $nombre = $_POST['nombre']; // on stocke dans $nombre la valeur tapée 
  dans le formulaire
 // si le code ne correspond pas à celui déjà stocké 
  dans la variable de session après l'avoir hashé avec md5() comme 
  l'autre
  if(md5($nombre) != $_SESSION['valeur_image'])
  // on affiche une erreur
  echo '<h1>Le code ne correspond pas, réessayez !</h1>';
 // sinon le code est exact
  else echo '<h1>Le code est exact !</h1>';
  }
  ?>
<!-- Formulaire $_SERVER['PHP_SELF'] signifie que le traitement du formulaire se fait sur la même page -->
  <form name="verify_form" method="post" action="<? 
  $_SERVER['PHP_SELF'] ?>">
  <!-- Affichage de l'image créée par image.php -->
  <img src="image.php" alt="Captcha" id="captcha" 
  />
  <br /><br />
  <label for="Verification">Recopiez le code ci-dessus</label>
  <br />
  <input name="nombre" type="text" id="nombre">
  <br />
  <input type="submit" name="submit" value="Envoyer" 
  />
  </form>
  </body>
  </html>
  











Pour tout problème avec votre création d'images de vérification, vous pouvez laisser un commentaire sur cet article.




Rediriger un visiteur selon sa langue en PHP >

< Créer un flux RSS manuel ou automatique avec PHP




Commentaires

  • Le 30.08.2007, par odric

    J'ai un soucis avec l'image
    Faut il une image d'origine au format png?? comment doit on l'appeler??
    merci :) ^^
  • Le 30.08.2007, par ninou

    Salut,
    il faut utiliser l'image bruit.png (garde ce nom) disponible ici :
    http://www.pixtiz.com/files_blog/captcha-png/bruit.png
    que tu doit uploader sur ton serveur.

    ninou
  • Le 14.11.2007, par manu

    Salut, mon image n'apparait pas?
    Jesuis sur free
    Merci d'avance
  • Le 14.11.2007, par ninou

    Salut, il faut que tu puisses utiliser les sessions PHP, et il me semble qu'il faut faire une manip pour les activer sur free. Une petite recherche google de ce coté la et c'est bon ;)

  • Le 06.12.2007, par jlb59

    Bonjour,
    Je n'ai pas d'img qui s'affiche. Je suis chez Free.

    Que dois-je faire ?

    Merci d'avance. Cordialement. JLB59
  • Le 07.12.2007, par ninou

    Salut, il faut que tu puisses utiliser les sessions PHP, et il me semble qu'il faut faire une manip pour les activer sur free. Une petite recherche google de ce coté la et c'est bon ;)
  • Le 23.06.2008, par gastongfaim3

    Pour activer les sessions sur Free, il suffit de créer un répertoire nommé "sessions" à la racine de son site.
  • Le 25.08.2008, par Fanfoi125

    Les dernières versions de FireFox (3.0.1) et IE (7 émulé sous 8) ne comprennent pas ce script.
    Si vous rencontrez l'erreur :
    L'image "mon-image-qui-ne-marche-pas.png" ne peut être affichée car elle contient des erreurs
    allez faire un tour du côté des lignes de ce type :
    "imagettftext($image, 25, -10, 10, 35, aleatoire($colors), aleatoire($fonts), $char1);"
    En effet, le nom de font que retourne la fonction de tir aléatoire dans le tableau renvoi uniquement le nom de l'écriture, sans l'extension.
    Ce qui ne marche pas...

    Dans la boucle foreach(), remplacez simplement
    $fonts[] = $filename;
    par
    $fonts[] = $filename.'.ttf';

    Cordialement.
  • Le 25.08.2008, par ninou

    Salut,
    c'est un script php serveur, le navigateur n'a aucune importance

    Cdt
    Fabien
  • Le 05.01.2009, par bachdev

    Salut,
    J'en profite pour dire Merci mille fois à celui qui à mis ce morceau de code: car j'en ai tellement chié des prunes depuis plus de 2 semaines j'ai perdu mon temps à corriger tous les pollueurs du net et j'ai même fini par les insulter....lol. Mais c'est le premier captcha qui fonctionne parfaitement bien! bon c'est vrai qu'il y a quelques petites corrections à faire je viens tout juste de passer environ 1 heure dessus mais ça marche et il est vraiment simple...correction à apporter au niveau de la variable $_server phpself-->il faut mettre un echo ou print devant.
    Il faut aussi tuer les session dans le formulaire par
    unset($_SESSION['valeur_image']), bref, je n'ai plus vraiment en tête tous les détails mais il est très simple à faire tourner...
    Encore Mille Mercis à celui qui l'a offert! bonne et heureuse année avec plein de bonheur...
  • Le 08.01.2009, par cokys

    Merci pour ce tuto, seulement sur google çà ne s'affiche plus lorsque je recharge la page
  • Le 08.01.2009, par cokys

    Mais çà marche sur Internet Explorer; même sur votre page
  • Le 08.01.2009, par cokys

    le même problème se passe. Est ce que quelqu'un peut m'aider.
  • Le 09.01.2009, par bachdev

    Salut, apparemment j'ai vendu la peau de l'ours av...oui, j'ai le même problème chez free...quelqu'un aurait une idée? Alors que j'ai bien un répertoire sessions et les sessions fonctionnent parfaitement; j'ai aussi pu vérifier que la bibliothèque GD est bien activée..ainsi que tous les chemins des repertoires fonts et accès à l'image...bref, tout fonctionne parfaitement en local, mais aucune image n'apparait lorsque je suis sur le serveur de free...quelqu'un aurait une idée?
  • Le 24.12.2009, par captcha

    Pour installer le script sur free il faut créer un repertoire sessions à la racine du site ... LE FORMULAIRE a des bugs ...
    version corrigée :
    /** On démarre une session pour pouvoir récupérer le code généré */
    session_start();
    ?>




    Formulaire avec captcha


    /** Si le formulaire a été soumis */
    if(isset($_POST['submit'])) { //n1
    $nombre = $_POST['nombre']; // on stocke dans $nombre la valeur tapée
    //dans le formulaire
    // si le code ne correspond pas à celui déjà stocké
    // dans la variable de session après l'avoir hashé avec md5() comme
    // l'autre
    if(md5($nombre) != $_SESSION['valeur_image']) {
    // on affiche une erreur
    echo "

    Le code ne correspond pas !

    "; }
    // sinon le code est exact
    else { echo "

    Le code est exact !

    "; } } //fin n1 ?>



    Captcha











Vous devez être inscrit pour pouvoir ajouter un commentaire
bouton inscription jeux
Aide | Contact | Règlement | Plan du Site | tutorial illustrator flash css php