Captcha, generateur une image avec le code voulut ( systeme antispam )

Soyez le premier à donner votre avis sur cette source.

Snippet vu 14 571 fois - Téléchargée 19 fois

Contenu du snippet

Bonjour,
Encore une source on ne peut plus répandu mais bien utile lorsque l'on veut developper un systeme antispam pour forum, livre d'or, commentaires etc...
En réalité, ma source permet d'afficher un code cachée dans une image ( aller voir l'exemple sur http://pproject.webzzanine.net/image.php si vous ne comprenez pas ). J'ai également mis une fonction qui genere un code alphanumerique simple du nombre de caractere que l'on souhaite. A vous de coder le reste comme bon vous semble pour l'utiliser, par exemple, pour gener un peu l'action des robots qui voudraient spammer vos pages.

Source / Exemple :


<?php

function make_img($content = '')
{
	$timage = array((strlen($content)*18)+10,15); // array(largeur, hauteur) de l'image; ici la largeur est fonction du nombre de lettre du contenu, on peut bien sur mettre une largeur fixe.
	$content = preg_replace( '/(\w)/', '\\1 ', $content); // laisse plus d'espace entre les lettres
	$image  = imagecreatetruecolor($timage[0], $timage[1]); // création de l'image

	// definition des couleurs
	$white  = imageColorAllocate($image, 255, 255, 255);
	$grey   = imageColorAllocate($image, 210, 210, 210);
	$text_color = imageColorAllocate($image, rand(0, 150), rand(0, 50), rand(0, 60));

	imageFill($image, 0, 0, $white); // on remplit l'image de blanc
	
	// on remplit l'image avec des polygones (couleurs claires)
	for ($i = 0; $i < rand(3, 5); $i++)
	{
		$x = rand(3, 10);
		$poly = array();
		for ($j = 0; $j < $x; $j++)
		{
			$poly[] = rand(0, $timage[0]);
			$poly[] = rand(0, $timage[1]);
		}
		imageFilledPolygon($image, $poly, $x, imageColorAllocate($image, rand(130, 255), rand(130,255), rand(130, 255)));

	}
	
	// Création des pixels gris
	for ($i = 0; $i < $timage[0] * $timage[1] / rand(15, 18); $i++)
	{
		imageSetPixel($image, rand(0, $timage[0]), rand(0, $timage[1]), $grey);
	}

	// affichage du texte demandé; on le centre en hauteur et largeur (à peu près ^^")
	imageString($image, 5, ceil($timage[0]-strlen($content)*8)/2, ceil($timage[1]/2)-9, $content, $text_color);

	$type = function_exists('imageJpeg') ? 'jpeg' : 'png';
	@header('Content-Type: image/' . $type);
	@header('Cache-control: no-cache, no-store');
	($type =='png') ?imagePng($image) : imageJpeg($image);
	ImageDestroy($image);

	exit();
}

function generer_code($car) {
	$string = "";
	$chaine = "abcdefghijklmnpqrstuvwxy123456789";
	for($i=0; $i<$car; $i++) {
	$string .= $chaine[rand()%strlen($chaine)];
	}
	return $string;
} 

make_img(generer_code(5));

?>

Conclusion :


Je peux ameliorer la source si ça peut être utile à certain ( en la transformant en un vrai systeme antispam par exemple ) mais je pense qu'il est plus interessant de faire les choses par soi même ^^.
Tout commentaires sont les bienvenus.

A voir également

Ajouter un commentaire

Commentaires

Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
36
en y reflechissant, dans mon code, ceci :
for ($i=0;$i<$x;$i++){
for ($j=0;$j<$y;$j++){
$a = imagecolorat($img, $i, $j);
if (!is_text($a)){
imageline($img, $i, $j, $i, $j, $w);
}
}
}
n'est meme pas obligatoire
Messages postés
6
Date d'inscription
jeudi 15 juin 2006
Statut
Membre
Dernière intervention
27 mai 2007

Hmmm ok. Merci à tout les deux pour vos interventions, vraiment interessant ton code coucou747 c'est vrai que du mon image est vraiment super facile à contourner... Je posterai pas un nouveau code catpcha "amélioré" ( avec par exemple le systeme de questions ou operations mathematiques simple ) puisqu'il y en a déjà de très bien sur phpcs.

A bientôt tout le monde ;)
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
36
<?php
function is_text($a){
$r = $a / 65536;
$v = ( $a / 256 ) % 256;
$b = $a % 256;
return !($r>100 && $v>100 && $b> 100);
}

$img=imageCreateFromjpeg('1q9yb.png')
or die('erreur');
$w = ImageColorAllocate ($img, 255, 255, 255);
$bl = ImageColorAllocate ($img, 0, 0, 0);
$x=imagesX($img);
$y=imagesy($img);
for ($i=0;$i<$x;$i++){
for ($j=0;$j<$y;$j++){
$a = imagecolorat($img, $i, $j);
if (!is_text($a)){
imageline($img, $i, $j, $i, $j, $w);
}
}
}
$text_width = imagefontwidth(5);
$text_height = imagefontheight(5);
$py=ceil($y-$text_height)/2-1;
$chaine = 'abcdefghijklmnpqrstuvwxy123456789';
for ($i=0;$i<5;$i++){
$max=$x*$y;
$px= ceil($x-5*$text_width)/2+$i*$text_width*2+1;
//imagerectangle($img, $px-2*$text_width, $py, $px-$text_width, $py+$text_height-1, $bl);
//si tu veux t'amuser a cerner tes lettres...
for ($j=0;$j<strlen($chaine);$j++){
$image = imagecreatetruecolor($x, $y);
$white = imageColorAllocate($image, 255, 255, 255);
$black = imageColorAllocate($image, 0, 0, 0);
imageFill($image, 0, 0, $white);
imageString($image, 5, $px-2*$text_width, $py, $chaine[$j], $black);
$compare=0;
for ($k=$px-2*$text_width; $k<$px-$text_width; $k++){
for ($l=$py; $l<$py+$text_height-1; $l++){
$a = imagecolorat($img, $k, $l);
$b = imagecolorat($image, $k, $l);
if (is_text($a)!=is_text($b)){
$compare++;
}
}
}
if ($compare<$max){
$lettre=$chaine[$j];
$max=$compare;
}
}
echo $lettre;
}
?>
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
36
if ($r>100 && $v>100 && $b> 100){
polution
}else{
texte
}
c'est disons un debut, mais en aucun cas une protection (et evitez le troll la protection parfaite n'existe pas, car je ne suis pas un geni, alors si j'arrive a la passer, beaucoup d'autres le peuvent)

cerede2000, t'as des images tres compliquees a lire...
http://www.phpcs.com/codes/CAPTCHA-VISUELLE_42607.aspx ca c'est pas mal par exemple (enfin perso, j'y passerais plus d'une nuit, et je ne ferais pas un algo a la rache comme ce que je peux faire ici...)

la, l'ecriture est droite, avec une police classique, ensuite, savoir ou sont positionnes les caracteres c'est un jeux d'enfant... differentier les caracteres de la polution aussi...

je posterais probablement plus tard un code qui renvoi le texte a partir d'une de ces image
Messages postés
71
Date d'inscription
vendredi 12 janvier 2007
Statut
Membre
Dernière intervention
6 septembre 2013

Malheureusement ce système n'est plus antispam... Les robots sont capable de lire des images comme celle que tu génère ;)
Pour un système réellement antispam il faut utiliser d'autre méthode, comme poser des questions simple, demander ne description d'image...

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.