Turing number

Description

Un turing number est une image contenant un code difficile à lire, que l'utilisateur doit entrer pour valider un formulaire, ce qui permet d'empêcher un robot de soumettre le formulaire.
La capture d'écran n'est pas très jolie... mais bon, je ne me suis occupé ici que du code, je vous laisse faire votre présentation :)

Contenu du zip :
- lisez-moi.txt : divers info sur le script (copyright, où trouver la dernière version...), où demander de l'aide...
- mpam4_php02_turing_1.1.7z : la version originale
- mpam4_php05_turing_session_ed_1.1.7z : la Session Edition

Requis (version originale) : PHP et MySQL
Requis (Session Edition) : PHP seulement

Inspiré de : IMAGE CRYPTÉE DE PROTECTION POUR FORMULAIRE WEB, par matrey : http://www.phpcs.com/code.aspx?ID=13359
et publié avec l'aimable autorisation de l'auteur

Blabla légal :) : ce script est gratuit, vous pouvez le modifier/redistribuer sous les termes du GNU General Public License publié par la Free Software Foundation, soit la version 2 de la licence, ou (à votre convenance), n'importe quelle version ultérieure (voir le fichier readme).

La source suivante n'est que le fichier l_gen.php (qui génère l'image). Pour le reste, voir le zip.

Mise à jour : inclusion du code posté par matrey pour le code en lettres, amélioration de la présentation du code (source), quelques modifications du code de génération de l'image, avec des pixels de bruit plus nombreux et de toutes les couleurs, une marge à gauche aléatoire et plus de commentaires.
        • le code ci-dessous est la version précédente ! ****
        • la MAJ est uniquement dans le zip ****

Source / Exemple :


<?php
if(!isset($_GET["session"])){die("Error generating turing number : no session specified. Get outta here ! :p");}

include("l_db.php");

$session=$_GET["session"];
$sql = "SELECT code FROM turings WHERE session ='$session'";

$resultat = mysql_query($sql);
$ligne = mysql_fetch_array ($resultat) or die('');

$code=$ligne['code'];
mysql_close();

// Création de l'image, vous ne devriez modifier les dimensions que si vous modifiez la longueur du code ! enfin, vous faites ce que vous voulez... :)
$largeur=72;
$hauteur=25;
$img = imagecreate($largeur, $hauteur) or die("Cannot Initialize new GD image stream");
// Les couleurs...
$bgc = imagecolorallocate($img, rand(235,255), rand(235,255), rand(235,255));	// la couleur de fond sera au hasard...
$black = imagecolorallocate($img, 0, 0, 0);
$gris = imagecolorallocate($img, 128, 128, 128);
// Remplissage du fond
imagefilledrectangle($img, 0, 0, $largeur, $hauteur, $bgc);
// Ecriture du code (le premier 5 est la taille - de la police par défaut - la plus grande dans GD)
// Ca évite d'avoir à installer FreeType, librairie qui ajoute le support des polices TrueType
$hor_pos=12; // position horizontale, à incrémenter à chaque fois ! (au hasard... :) )
for($i=0;$i<strlen($code);$i++)
	{imagestring($img, 5, $hor_pos, rand(2,10), $code[$i], $black);$hor_pos+=rand(10,15);}

// Là, on va rendre l'image franchement dure à lire :
// Ajout d'un bruit (pixels)
for($i=0;$i<150;$i++)
	{
	imagesetpixel($img, rand(0,$largeur), rand(0,$hauteur), $gris);
	}
// Ajout d'un bruit (lignes) N'en mettez pas trop, sinon c'est carrément illisible...
for($i=0;$i<5;$i++)
	{
	if($i<2){$x1=rand(0,$largeur);$y1=0;$x2=abs($x1-rand(0,5));$y2=$hauteur;}
	else {$x1=0;$y1=rand(0,$hauteur);$x2=$largeur;$y2=abs($y1-rand(0,5));}
	imageline($img, $x1, $y1, $x2, $y2, $black);
	}

// Crétion de l'entête
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 
header("Cache-Control: no-store, no-cache, must-revalidate"); 
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header("Content-Type: image/png");
ImagePNG($img);
imagedestroy($img);

?>

Conclusion :


Là, désolé, mais je sais pas quoi mettre comme conclusion : j'ai déjà tout dit, je crois. Les commentaires sont les bienvenus (en particulier les idées pour mieux "tagger" l'image :) )
Merci à matrey pour tous ces commentaires :)
Afin de garder la meilleure compatiblité possible, je n'ai pas inclus le code d'utilisation des truetypes... De toutes façons, c'est pas très compliqué :)

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.