Derniers Articles
Vous êtes ici : Accueil / Tutoriaux / Développement / Captcha protection anti-spam en php

Captcha protection anti-spam en php

Bonjour,
dans ce tutoriel, je vais vous montrer comment faire un système de captcha pour protéger contre le spam.
Les captcha sont des images contenant une chaine de caractère que l’utilisateur doit recopier de façon à prouver qu’il est un humain et non un système automatisé. Pour qu’un captcha soit bon, l’image doit être difficilement déchiffrable par un ordinateur utilisant des techniques qui détectent les caractères sur l’image, mais l’image doit aussi être facilement déchiffrable par les humains.

Le fonctionnement d’un système de captcha est simple. Sur le formulaire, nous allons mettre l’image captcha, cette image contiendra les caractères aléatoires que l’utilisateur devra recopier. Lorsque l’utilisateur validera le formulaire, les caractères qu’il a copié seront comparés à ceux qui étaient sur l’image (ils auront étés stockés dans les sessions).

L’image que nous allons générer doit être aléatoire. Les lettres, leur couleurs et leur angle seront déterminés aléatoirement à l’aide de la fonction php: rand
Nous allons utiliser la police de caractère Liberation Sans:

 

Pour rendre l’image plus complexe, nous allons aussi mettre des lignes de position, de taille et de couleurs différentes.

Voici le code pour faire l’image du système de captcha:
captcha.php

<?php
//Le nombre de caracteres
$ncarac = 5;
//Le nombre de lignes
$nlignes = 7;
//Les caractres qui seront utilises
$carac = array(‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’, ‘h’, ‘i’, ‘j’, ‘k’, ‘l’, ‘m’, ‘n’, ‘o’, ‘p’, ‘q’, ‘r’, ‘s’, ‘t’, ‘u’, ‘v’, ‘w’, ‘x’, ‘y’, ‘z’);
$nca = count($carac);//On determine le nombre de lettres possible: 26
//Police de caractere a utiliser
$font = ‘liberation_sans.ttf’;
//On determine les tailles de limage
$x = $ncarac*30+10;
$y = 40;
//On cree limage
$img = imagecreatetruecolor($x,$y);
//On remplit limage avec du blanc
imagefill($img,0,0,imagecolorallocate($img, 255,255,255));
//On ajoute les caracteres
$chaine = «  »;
for($i=1;$i<=$ncarac;$i++)//On ajoute $ncarac caracteres
{
        $c = $carac[rand(0,($nca-1))];//Le nouveau caractere sera choisi aleatoirement
        imagettftext($img, 25, rand(-10,10), (($i-1)*30)+5, 30, imagecolorallocate($img, rand(0,100), rand(0,100), rand(0,100)),$font, $c);//On ajoute le caractere sur limage
        $chaine .= $c;//On ajoute le nouveau caractere a la chaine
}
//On ajoute les lignes
for($i=1;$i<=$nlignes;$i++)//On ajoute « $nlignes » lignes
{
        imagesetthickness($img,rand(1,2));//On specifie lepaisseur de la ligne
        imageline($img,rand(0,$x),rand(0,$y),rand(0,$x),rand(0,$y), imagecolorallocate($img, rand(0,100), rand(0,100), rand(0,100)));//On ajoute la ligne
}
//On stoque la chaine de caractere dans les sessions
session_start();
$_SESSION[‘captcha’] = $chaine;
//On affiche l’image finale
header(‘Content-type: image/png’);
imagepng($img);
?>

Et le code pour le formulaire:
formulaire.php

<?php
session_start();
//On verifie si le formulaire a ete valide
if(isset($_POST[‘nom’], $_POST[‘captcha’], $_SESSION[‘captcha’]))
{
        //On compare le code entre par lutilisateur avec celui de limage(qui avait ete stoque dans les sessions)
        if(strtolower($_POST[‘captcha’])==strtolower($_SESSION[‘captcha’]))
        {
                unset($_SESSION[‘captcha’]);
                echo ‘<strong style= »color:#00bb00; »>Le code que vous avez entr&eacute; est le bon.</strong>’;
                $form = false;
                //Ici, vous pouvez envoyer les donnes du formulaire
        }
        else
        {
                echo ‘<strong style= »color:#bb0000; »>Le code que vous avez entr&eacute; est mauvais, veuillez r&eacute;essayer.</strong>’;
                $form = true;
        }
}
else
{
        $form = true;
}
//Si $form vaut true, le formulaire sera affiche
if($form)
{
?>
<form action= »formulaire.php » method= »post »>
Votre nom:<input type= »text » name= »nom » value= »<?php if(isset($_POST[‘nom’])){echo htmlentities($_POST[‘nom’]);} ?> » /><br />
Veuillez recopier le code cidessous:<input type= »text » name= »captcha » /><br />
<img src= »captcha.php » alt= »CAPTCHA » /><br />
<input type= »submit » value= »Envoyer » />
</form>
<?php
}
?>

Répondre

Votre adresse email ne sera pas publiée.

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.

shared on wplocker.com