Captcha ( anti-spam, anti-robot )

Description

Génération d'une image pour anti-robot/anti-spam

A chaque chargement de la page, voici ce qui change :

1/ La couleur de fond
2/ La chaîne de caractère
3/ La couleur de chaque caractère ( plus foncé que la couleur de fond dans tous les cas )
4/ La police de chaque caractère
5/ L'angle de chaque caractère
6/ La taille de chaque caractère
7/ La position vertical de chaque caractère

Aucun caractère sort de l'image.
De temps en temps il y a des chiffres qui se chevauchent suivant l'angle, le chiffre, sa taille et sa position, mais ça reste dans 99% des cas, lisible. ( pour ma part )

Source / Exemple :


<?php
session_start();

srand(); //initialisation du générateur mais plus obligatoire > PHP 4.2

// Définition du content-type
header("Content-type: image/png");

$lettres = 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');

$code = $lettres[rand(0,25)].rand(100,1000000); 
$longueurcode = strlen($code);

$_SESSION['code'] = $code; //pour pouvoir tester si le code saisie est bien égal à celui saisie ;)

$largeur = $longueurcode * 25;
$hauteur =  40;

$image = imagecreatetruecolor($largeur, $hauteur);

$couleurfond = imagecolorallocate($image, rand(150,255),rand(150,255),rand(150,255));

imagefilledrectangle($image, 0, 0, $largeur, $hauteur, $couleurfond);

$fontchiffre = array('1.ttf','2.ttf');
$fontlettre = array('3.ttf');

imagettftext($image, rand(15,30), rand(-45,15), 10, 35, imagecolorallocate($image, rand(10,100) ,rand(10,100),rand(10,100)), $fontlettre[0], $code[0]);

for ($i = 1; $i < $longueurcode; $i++) 
{
    $largeurx = 20 * $i + 30;
    $hauteury = rand(25,40);
    imagettftext($image, rand(27,32), rand(0,45), $largeurx,$hauteury, imagecolorallocate($image, rand(10,100) ,rand(10,100),rand(10,100)), $fontchiffre[rand(0,1)], $code[$i]);
}

imagepng($image); //génère l'image
imagedestroy($image); //détruit l'image

?>

Conclusion :


Un petit truc avec la police 3.ttf, elle s'affiche en majuscule, alors que la lettre est en minuscule, mais bon ça, c'est le créateur de la police qui a voulu tout mettre en majuscule, la seule différence, c'est que la lettre est inversé pour les majuscules.. ><
Pour ma part, vu que j'ai mis que des minuscules, lors du test, j'utilise la fonction php strtolower() pour le code saisie.

Voilà voilà, si quelqu'un arrive a bousillé mon captcha, si c'était possible qu'il me le fasse savoir pour que je puisse l'améliorer.
C'est ma première source que je poste ici, en espérant qu'elle puisse aider des personnes.

Si vous avez des questions, ou des critiques, n'hésitez pas.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.