Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CAPTCHA, GENERATEUR UNE IMAGE AVEC LE CODE VOULUT ( SYSTEME ANTISPAM )


Description

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

  • <?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));
  • ?>
<?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.

 

Commentaires et avis

signaler à un administrateur
Commentaire de cerede2000 le 27/05/2007 01:08:55

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...

signaler à un administrateur
Commentaire de coucou747 le 27/05/2007 02:49:57

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

signaler à un administrateur
Commentaire de coucou747 le 27/05/2007 03:15:09

<?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;
}
?>

signaler à un administrateur
Commentaire de greenzest le 27/05/2007 12:05:42

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 ;)

signaler à un administrateur
Commentaire de coucou747 le 27/05/2007 17:02:41

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

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

générer des miniatures avec gd 1.6 [ par vegetaline ] muhaha alors là c'est rigolo, un super défi pour les programmeurs fous!ok j'ai le code pour générer des miniatures grâce au php, mais ça marche qu'ave Help me [ par YuGiOhFlash ] [size=3] Help je cherche un code:Explication G une page index ou il fo ecrir un code pour voir des images.une page calculetrice pour mettre les images Image sur click .. [ par nicolas66 ] Bonsoir @ tous !Je voulais juste savoir comen il était possible d'afficher une image créee avec php dans la meme page ou il y a un formulaire sur clic imagecolorallocate [ par xylo2 ] Salut !J'ai fait un truc tout basique, je voudrais ajouter un texte sur une image pré-existante.Voici mon code :&lt;?if (!isset($mat)) $mat="Toto";< Probleme code de securité [ par zzzzzz ] Voila je suis debutant en php et j'ai inclue un fichier code.php avec comme contenu: header("Content-type: image/jpeg"); $nbr = rand(10000,100000); PROBLEME GENERATION IMAGE AVEC GD !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! [ par zzzzzz ] C'est desesperent! jen'arrive toujours pas a comprendre d'ou viens le prob depuis hier :(en fait j'ai un fichier code.php de contenue:&lt;?$nbr = rand echo avec imagecreatefromjpeg ?? [ par PsYk0PaT ] Bonjour,J'ai ce bout de code qui fonctionne à merveille: $image = imageCreateFromJpeg("la_map.jpg"); $colorCyan = imageColorAllocate$image,0,255,255); code perso: balises spéciales [ par Samiby ] Bonjour,Je programme actuellement un blog, et pour poster des lessages, j'ai créé un code personnalisé.J'ai un prblème avec les images.La syntaxe de m image et GD [ par papipsycho ] salut a tous voila jai un pb donc jai un script qui marche tres bien pour cree des image et prendre des inf dans ma BDD(un script que jai recupere ici ftp_put [ par panpan ] Hello.J'ai un probleme avec ftp_putQuand j'execute mon scripte d'upload, l'image est bien uploader sur le serveur, mais internet explorer m'affiche ce


Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,421 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.