Image anti-spam

Soyez le premier à donner votre avis sur cette source.

Vue 65 392 fois - Téléchargée 1 633 fois

Description

Un petit script tout simple qui crée une image anti-spam...

Deux versions (correspondant aux deux zones de la capture):
- une simple (mais plus facilement lisible par des scripts OCR)
- et la seconde ben... moins lisibles (pour les gens comme pour les robots, ^^)

Dans le cas d'une utilisation de la seconde version, il serait pas mal de remplir le formulaire avec les valeurs déjà entrées en cas d'erreur de code car ca risque de se produire (on peut aussi enlenver le 0, le O et le D des caractères disponibles).

Source / Exemple :


<?php
session_start();

// type de flood
$name = $_GET['name'];
// nb de caractères
$strlen = (int) $_GET['strlen'];

// taille de l'image ( width )
$width = $strlen * 30 + 20;
$height = 60;

// création
$img = imagecreatetruecolor( $width, $height );
// antialising, c'est plus bô! :-)
imageantialias( $img, 1 );

// chaine
$string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$chaine = '';
for( $i = 0; $i < $strlen; $i++ )
	$chaine .= $string[ mt_rand( 0, 35 ) ];
	
$_SESSION[ $name ] = $chaine;

// couleur de départ
$c1 = array( mt_rand( 200, 255), mt_rand( 200, 255), mt_rand( 200, 255) );
// couleur finale
$c2 = array( mt_rand( 150, 200), mt_rand( 150, 200), mt_rand( 150, 200) );

$colors = array( imagecolorallocate( $img, 70, 130, 255 ) , imagecolorallocate( $img, 255, 237, 175 ), imagecolorallocate( $img, 166, 250, 186 ), imagecolorallocate( $img, 253, 188, 251 ), imagecolorallocate( $img, 255, 255, 255 ) );

// création de l'image
for( $i = 0; $i < $width; $i++ )
{
	$r = $c1[0] + $i * ( $c2[0] - $c1[0] ) / $width;
	$v = $c1[1] + $i * ( $c2[1] - $c1[1] ) / $width;
	$b = $c1[2] + $i * ( $c2[2] - $c1[2] ) / $width;
	$color = imagecolorallocate( $img, $r, $v, $b );
	
	imageline( $img, $i, 0, $i, $height, $color );
}

// caractères
for( $i = 0; $i < $strlen; $i++ )
{
	$col = imagecolorallocate( $img, mt_rand( 0, 120 ), mt_rand( 0, 120 ), mt_rand( 0, 120 ) );
	imagettftext( $img, mt_rand( 20, 25 ), mt_rand( -30, 30 ), 10 + $i * 30, 35, $col, 'comic.ttf', $chaine[ $i ] );
}

// quelques lignes qui embêtent
for( $i = 0; $i < 8; $i++ )
{
	imageline( $img, mt_rand(0, $width), mt_rand(0, $height), mt_rand(0, $width), mt_rand(0, $height), $colors[mt_rand( 0, 4 )] );
}

$noir = imagecolorallocate( $img, 0, 0, 0 );

// bordure
imageline( $img, 0, 0, $width, 0, $noir );
imageline( $img, 0, 0, 0, $height, $noir );
imageline( $img, $width - 1, 0, $width - 1, $height, $noir );

// header: image
header("Content-type: image/png");
imagepng( $img ); 
imagedestroy( $img );
?>

########################################################################
Seconde version:
<?php
session_start();

// type de flood
$name = $_GET['name'];
// nb de caractères
$strlen = (int) $_GET['strlen'];

// taille de l'image ( width )
$width = $strlen * 23 + 20;
$height = 60;
// taille de chaque zone de couleur
$widthColor = $width / 4;

// création
$img = imagecreatetruecolor( $width, $height );
// antialising, c'est plus bô! :-)
imageantialias( $img, 1 );

// chaine
$string = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$chaine = '';
for( $i = 0; $i < $strlen; $i++ )
	$chaine .= $string[ mt_rand( 0, 35 ) ];
	
$_SESSION[ $name ] = $chaine;

// couleur de départ
$c1 = array( mt_rand( 200, 255), mt_rand( 200, 255), mt_rand( 200, 255) );
// couleur finale
$c2 = array( mt_rand( 70, 180), mt_rand( 70, 180), mt_rand( 70, 180) );
// pas pour chaque composante de couleur
$diffsColor = array( ( $c1[0] - $c2[0] ) / $widthColor, ( $c1[1] - $c2[1] ) / $widthColor, ( $c1[2] - $c2[2] ) / $widthColor );

$start = 0;
$end = $widthColor;

for( $j = 0; $j < 4; $j++ ) // boucle pour chacune des 4 zones
{
	$r = $j % 2 == 0 ? $c1[0] : $c2[0]; // composante r de départ
	$v = $j % 2 == 0 ? $c1[1] : $c2[1]; // idem v
	$b = $j % 2 == 0 ? $c1[2] : $c2[2]; // idem b
	
	// création des lignes
	for( $i = $start; $i < $end; $i++ )
	{
		if( $j % 2 == 0 )
		{
			$r -= $diffsColor[0];
			$v -= $diffsColor[1];
			$b -= $diffsColor[2];
		}
		else
		{
			$r += $diffsColor[0];
			$v += $diffsColor[1];
			$b += $diffsColor[2];
		}
		
		$color = imagecolorallocate( $img, $r, $v, $b );
		
		imageline( $img, $i, 0, $i, $height, $color );
	}
	
	$start += $widthColor;
	$end += $widthColor;
}

$colorsChar = array(); // on va mémoriser les couleurs des caractères

// caractères
for( $i = 0; $i < $strlen; $i++ )
{
	$colorsChar[$i] = imagecolorallocate( $img, mt_rand( 0, 120 ), mt_rand( 0, 120 ), mt_rand( 0, 120 ) );
	imagettftext( $img, mt_rand( 20, 25 ), mt_rand( -35, 35 ), 10 + $i * 23, 35, $colorsChar[$i], 'comic.ttf', $chaine[ $i ] );
}

// quelques lignes qui embêtent
for( $i = 0; $i < 10; $i++ )
{
	imageline( $img, mt_rand(0, $width), mt_rand(0, $height), mt_rand(0, $width), mt_rand(0, $height), $colorsChar[mt_rand( 0, $strlen - 1 )] );
}

$noir = imagecolorallocate( $img, 0, 0, 0 );

// bordure
imageline( $img, 0, 0, $width, 0, $noir );
imageline( $img, 0, 0, 0, $height, $noir );
imageline( $img, $width - 1, 0, $width - 1, $height, $noir );

// header: image
header("Content-type: image/png");
imagepng( $img ); 
imagedestroy( $img );
?>

Conclusion :


Si le script est enregistré dans le fichier: anti_spam.php, on appèle l'image comme ceci:

<img src="anti_spam.php?name=livreor&strlen=4" alt="anti-flood" />

>> le contenu dans l'image sera dans $_SESSION['livreor']
>> 4 caractères

Si $spam représente l'entrée utilsateur, le test se fait comme ceci:
if( $_SESSION['livreor'] != strtoupper( $spam ) )
// erreur ici

Voilà, j'attends vos comments sur ce petit script tout simple!

P.S. Ne pas oublier le session_start() sur la page qui vérifie les données! :-)

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

yayou07
Messages postés
1
Date d'inscription
mardi 27 novembre 2007
Statut
Membre
Dernière intervention
14 mai 2010
-
bonjour pouvais vous me decrir cela etape par etape puisque j'ai fait comme vous marquez mais y m affiche juste anti flood ppas d image il ne la traite pa ou je c pa vrmt prtant j ai le fichier anti_spam.php la police sous la mm racine é kan j met image source ça donne rien j ai ma oublier de mettre session start () en haut du script é du formulaire
coockiesch
Messages postés
2268
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
13 septembre 2013
3 -
Salut!
C'est une idée! Moi j'avais rajouté plusieurs contraintes temporelles en me disant qu'un humain pouvait difficilement taper un message en moins de 2 secondes, ... Je pense que tu peux aussi détecter le nombre de liens dans le message, etc...

Raf
mailliam
Messages postés
261
Date d'inscription
mardi 2 juillet 2002
Statut
Membre
Dernière intervention
10 mars 2014
2 -
Coucou les loulous!!
moi j'ai mis ce superbe code sur mon site car j'étais harcelé par ces pu*** de robots de spam!
il fonctionne très bien, si ce n'est qu'un des robot qui propose du viagra arrive tjs à me mettre jusqu'a 11 pub par jour sur mon forum!!! Comment il fait?! logiciel OCR? ils sont ballaises quand même!!

Mais j'ai trouvé une parade qui a l'air de bien marcher! je laisse évidement ce captcha anti spam, mais pour le lien qui renvoie à mon forum, je met comme ca:

<form method="post" action="forum.php" name=form1>

[javascript:document.form1.submit() forum]
</form>
de cette facon j'envoie la variable "antispam" à ma page forum.php
et dans la page je contrôle que dans la variable il y aie "000" de cette facon:

<?php
if ($antispam == "000")
{
//ok (ca veut dire que la page est chargée en passant par le lien..)
}
else
{
print "Une Erreur s'est produite!";
exit;
}
?>

donc comme le robot charge directement les pages qui ont des forums, donc ici direct forum.php sans passer par le lien, la variable antispam est vide et le formulaire ne s'affiche pas :)
JohnVass
Messages postés
2
Date d'inscription
lundi 18 mai 2009
Statut
Membre
Dernière intervention
5 mars 2012
-
Salut !

J'ai essayé d'intégrer ce système dans un site en cours dé développement dans un serveur off-line, mais l'image ne s'affiche pas. Je n'ai droit qu'à l'affichage du "alt". Pourtant, j'ai mis le fichier anti_spam.php ( en enlevant les lignes de la version 1 car je souhaite intégrer la version 2 ) à la racine du site, avec mon formulaire. Malgré tout, je n'ai aucune image qui s'affiche ! As-tu une explication à cela ? Vu que je débute en php, il est possible que j'aie oublié un détail !

Merci !
speyrard
Messages postés
20
Date d'inscription
dimanche 30 décembre 2007
Statut
Membre
Dernière intervention
3 mars 2012
-
Rien à redire
Code bien documenté, facile à adapter

Nickel

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.