Créer un compte
Connexion

[GD]Captcha protection anti-spam en php - captcha php gd sessions spam image


[GD]Captcha protection anti-spam en php - captcha php gd sessions spam image [GD]Captcha protection anti-spam en php - captcha php gd sessions spam image Le 12/07/2010 à 00:17:27
Note: 4/5
Mots clés: captcha php image gd anti-spam protection detection humain captcha texte image robots image gd script captcha tutoriel formulaire sessions captcha Completely Automated Public Turing test to Tell Computers and Humans Apart

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:
Image
Police de caractère Chopin Script

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
}
?>
Essayer
Merci et j'espère que ce tutoriel vous sera utile.

Scripts et Tutoriels similaires

[GD]Écrire un texte sur une image avec une police TTF - imagettftext [GD]Écrire un texte sur une image avec une police TTF - imagettftext Image du jour en php sans GD - script une image à chaque jour Image du jour en php sans GD - script une image à chaque jour Parser du BBcode en (X)Html - convertir du bbcode en html/convertir du html en bbcode en utilisant les expressions réguliaires(regex) Parser du BBcode en (X)Html - convertir du bbcode en html/convertir du html en bbcode en utilisant les expressions réguliaires(regex) [GD]Faire un dégradé en php GD - fonction dégradé imagerie [GD]Faire un dégradé en php GD - fonction dégradé imagerie [Tutoriel]Mettre une image sur du texte sous photoshop [Tutoriel]Mettre une image sur du texte sous photoshop