DevKB
Web Development Knowledge Base
HOME | TOP 20 | WRITE AN ARTICLE |
Sections :



RSS RSS Feed

You too, please publish your useful code snippets in any programming language :
write an article !


Valid HTML 4.0 Transitional

Plateforme d'envoi de gros fichiers en ligne
Dépannage site web
Blog infogérance
Hébergement e-mail

Aurélie Dufour - - 21/03/2008 - vue 6042 fois

Script PHP anti-robot facile à utiliser (captcha)

Cette fonction php génère une image PNG, qui contient 5 caractères que l'internaute doit recopier avant de valider un formulaire par exemple (captcha) :

<?

session_start();

//la fonction ci-dessous prend en paramètres le nombre de caractères à générer
function chaineAleatoire($nombre = 5)
{
        $chaine = '';
        for($i = 0; $i < $nombre; $i++)
        {
                $chaine .= mt_rand(0,9);
        }
        return $chaine;
}
function image($chaine)
{
        $largeur = (strlen($chaine) * 10); // Environ la largeur d'un caractere
        $hauteur = 20; // La bonne hauteur
        $image = imagecreate($largeur,$hauteur);

        $blanc = imagecolorallocate($image, 255, 255, 255); // On colore tout en blanc
        $noir = imagecolorallocate($image, 0, 0, 0);

        $milieuHauteur = ($hauteur / 2) - 8; // Pour centrer le texte en hauteur
        imagestring($image, 6, (strlen($chaine) / 2 ), $milieuHauteur, $chaine, $noir); // On ecrit au milieu 
        ImageRectangle ($image, 1, 1, $largeur - 1, $hauteur - 1, $noir); // Le rectangle autour pour l'esthétique
                $hauteur1 = mt_rand(2,$hauteur); // Barre aléatoire
                $hauteur2 = mt_rand(2,$hauteur); // Fin de la barre aléatoire

        ImageLine ($image, 2,$hauteur1, $largeur - 2, $hauteur2, $noir); // Barre aléatoire
        ImageLine ($image, 2, $milieuHauteur + 8, $largeur - 2, $milieuHauteur + 8, $noir); // Barre standard
        imagepng($image); // On dessine
        imagedestroy($image);
        return $chaine;
}

$nbr = 5; // on veut 5 chiffres aléatoires
$chaine = chaineAleatoire($nbr); // génération de la chaine
$_SESSION['chaine'] = md5($chaine); // on crypte la bonne valeur et on la met dans la session
header("Content-type: image/png");
imagepng($chaine); // on affiche l'image avec la chaine obtenue.

?>

Pour faire appel à cette fonction, vous n'avez même pas besoin de faire un include : faites comme si vous insériez une image toute simple en HTML :

<img src="captcha.php" alt="code anti-bot">
<input name="code" type="text" value="">

Ce qui affiche dans votre page Web quelque chose du type :code_securite

 

Pour finir, au début du script PHP qui recoit les données du formulaire, vérifiez la validité du code recopié par l'utilisateur :

<?php
session_start();
$code = $_POST["code"];
if(md5($code) != $_SESSION['chaine']) die("Erreur: code incorrect !");
 
... suite de votre code ...

 
Pour plus d'infos sur l'histoire des CAPTCHA, lire : http://fr.wikipedia.org/wiki/Captcha
 


Zendik - 11/09/2008
2 petites erreurs, me semble-t-il :

1)
function chaineAleatoire($nombre = 5)

le "=5" est inutile car un nombre est passé en paramètre lors de l'appel de la fonction :
$nbr = 5; // on veut 5 chiffres aléatoires
$chaine = chaineAleatoire($nbr); // génération de la chaine


2)
imagepng($chaine); // on affiche l'image avec la chaine obtenue.
ici c'est notre fonction de création d'image que l'on veut appeler (c'est elle qui appellera imagepng(), d'où :
image($chaine); // on affiche l'image avec la chaine obtenue.
foufou - - 12/07/2009
ça ne fonctionne pas
ok oui - 18/08/2010
Aucune image ne s'affiche
Bipbip - 02/03/2015
Pour que le code fonctionne :

Remplacer :

imagepng($chaine); // on affiche l'image avec la chaine obtenue.

par :

image($chaine); // on affiche l'image avec la chaine obtenue.

enjoy ;)


Write a comment :
Your name :     E-mail (optional) :

AntiSpam : what animal is visible on this picture ? :

Nos partenaires : iPhone 8 Cases & Protection