Image anti-spam agréable à lire et à regarder

Description

Ce code génère un mot de passe qu'il affiche sous forme d'image. Ceci permet d'éviter les robots qui viennent 'pourrir' la vie des webmaster.
En fait la perticularité de celui ci c'est qu'il est vraiment pas moche à regarder et qu'il est très paramétrable donc difficile aux robots de le lire.

Source / Exemple :


<?php
/*
  Générateur de mot aléatoire
  Créé par : Alexandre ISOARD (http://surfmaths.free.fr/)

  Avant de l'utiliser vous devez faire la partie de sauvegarde du mot (ceci permet de choisir votre mode de stockage SQL ou Session)
    Elle est a la fin du fichier.
    Sans cela le code fonctionne quand même mais ne servira à rien sauf à afficher une jolie image.

  • /
// ---- Valeurs par défaut ---- $autoriser=1; // Autorise l'envoi des paramètre. Utilise les paramètres par défaut si 0 $longueur=6; // Nombre de caractères par défaut du mot aléatoire $mot=""; // Mot par défaut (laisser vide pour ne pas en mêtre) $bruit=100; // Force du bruit par défaut en pourcentage (ne pas mettre trop fort) $amplitude=2; // Amplitude des torsions latérales par défaut en pixels (ne pas mettre trop fort) $degrade=1; // Activation ou non du fond en dégradé par défaut $largeur=48; // Largeur en pixels par défaut attribuée à chaque caractère $hauteur=64; // Hauteur en pixels par défaut de l'image $caracteres="ABCEHILMNOPSTUWXYZ"; // Liste des caractères authorisés pour le mot aléatoire (éviter ceux qui se ressemblent) $taille=28; // Taille de la police utilisée par défaut $police=dirname($_SERVER["SCRIPT_FILENAME"])."/verdanab.ttf"; // Police de caractères TrueType utilisée par défaut // ---- Réception et traitement des données ---- if($autoriser) { // Autorisation de réception des données ? if(isset($_REQUEST["mot"])) $mot=$_REQUEST["mot"]; else if(isset($_REQUEST["longueur"])) $longueur=$_REQUEST["longueur"]; // Si non, vérifier la présence du paramètre de longueur du mot if(isset($_REQUEST["bruit"])) $bruit=$_REQUEST["bruit"]; // Vérifier la présence du paramètre de la force du bruit (ne pas mêtre de chiffre trop grand) if(isset($_REQUEST["amplitude"])) $amplitude=$_REQUEST["amplitude"]; // Amplitude des torsions latérales par défaut en pixels (ne pas mettre trop fort) if(isset($_REQUEST["degrade"])) $degrade=$_REQUEST["degrade"]; // Vérifie si l'on a spécifié si l'on souhaitait le fond en dégradé ou en bruit if(isset($_REQUEST["largeur"])) $largeur=$_REQUEST["largeur"]; // Vérifier la présence du paramètre de la largeur de caractère if(isset($_REQUEST["hauteur"])) $hauteur=$_REQUEST["hauteur"]; // Vérifier la présence du paramètre de la hauteur de l'image if(isset($_REQUEST["taille"])) $taille=$_REQUEST["taille"]; // Vérifier la présence du paramètre de la taille des lettres } if($mot=="") for($i=0;$i<$longueur;$i++) $mot.=$caracteres{mt_rand(0,strlen($caracteres)-1)}; // Génération aléatoire du mot si il est vide else $longueur=strlen($mot); // Mesure la longueur du mot // ---- Image de base ---- $image=imagecreatetruecolor($largeur*$longueur,$hauteur); // Crée l'image de base $decalage=mt_rand(0,128); // Valeur aléatoire pour décaler les couleurs et ainsi avoir des couleurs foncées ou claires $a1=($decalage+mt_rand(0,64))%256; // Valeur aléatoire destinée aux composantes rouges $a2=($decalage+mt_rand(0,64))%256; // Valeur aléatoire destinée aux composantes vertes $a3=($decalage+mt_rand(0,64))%256; // Valeur aléatoire destinée aux composantes bleues // ---- Génération du fond ---- for($y=0;$y<$hauteur;$y++) { // Création du fond ligne par ligne if($degrade) { // Création d'un dégradé $decalage=floor(64*$y/$hauteur); // Variable d'avancement du dégradé $r=($a1+$decalage)%256; // Définition de la composante rouge $v=($a2+$decalage)%256; // Définition de la composante verte $b=($a3+$decalage)%256; // Définition de la composante bleue } else { // Création d'un fond hachuré $r=($a1+mt_rand(0,64))%256; // Définition de la composante rouge $v=($a2+mt_rand(0,64))%256; // Définition de la composante verte $b=($a3+mt_rand(0,64))%256; // Définition de la composante bleue } $cc=imagecolorexact($image,$r,$v,$b); if($cc==-1) $cc=imagecolorallocate($image,$r,$v,$b); // Assigne les couleurs de la palette sans doublons imageline($image,0,$y,$largeur*$longueur,$y,$cc); // Déssine la ligne de la couleur générée } // ---- Génération des caractères ---- $e=$largeur/2; // Calcul de l'écart nécessaire entre chaque caractère for($i=0;$i<$longueur;$i++) { // Déssine les caractères un par un $r=($a1+128+mt_rand(0,64))%256; // Définition de la composante rouge $v=($a2+128+mt_rand(0,64))%256; // Définition de la composante verte $b=($a3+128+mt_rand(0,64))%256; // Définition de la composante bleue $a=mt_rand(-15,15); // Angle aléatoire de déviation des caractères $cc=imagecolorexact($image,$r,$v,$b); if($cc==-1) $cc=imagecolorallocate($image,$r,$v,$b); // Assigne une couleur dans la palette sans doublons $tl=imagettfbbox($taille,$a,$police,$mot{$i}); // Encadrement des dimenssions de la lettre $ll=max($tl[0]-$tl[4],$tl[2]-$tl[6])/2; // Calcule la largeur maximale de la lettre $hl=max($tl[1]-$tl[5],$tl[3]-$tl[7])/2; // Calcule la hauteur maximale de la lettre $cxl=($tl[0]+$tl[2]+$tl[4]+$tl[6])/4; // Décalage du centre de la lettre suivant X par rapport à son origine $cyl=($tl[1]+$tl[3]+$tl[5]+$tl[7])/4; // Décalage du centre de la lettre suivant X par rapport à son origine $ah=$e-$ll; // Amplitude Horizontale du décalage aléatoire $av=$hauteur/2-$hl; // Amplitude Verticale du décalage aléatoire imagettftext($image,$taille,$a,floor($e*(1+2*$i)-$cxl+mt_rand(-$ah,$ah)),floor($hauteur/2-$cyl+mt_rand(-$av,$av)),$cc,$police,$mot{$i}); // Ecrit le caractère } // ---- Image filtrée ---- $image2=imagecreatetruecolor($largeur*$longueur,$hauteur); // Crée l'image filtrée $d=mt_rand(-1,1); // Initialise une nouvelle valeur aléatoire pour l'ondulation // Applique un filtre personnalisé très efficace for($y=0;$y<$hauteur;$y++) for($x=0;$x<$largeur*$longueur;$x++) imagesetpixel($image2,$x,$y,imagecolorat($image,(floor($largeur*$longueur+$x+mt_rand(-$bruit,$bruit)/60+$amplitude*sin((2*$y/$taille+$d)*pi())))%($largeur*$longueur),(floor($hauteur+$y+mt_rand(-$bruit,$bruit)/60))%$hauteur)); // ---- Ma marque (NE PAS ENLEVER NI MODIFIER) ---- $b=imagecolorexact($image,255,255,255); $n=imagecolorexact($image,0,0,0); imagestring($image2,1,$largeur*$longueur-85,$hauteur-9,"surfmaths.free.fr",$b); imagestring($image2,1,$largeur*$longueur-87,$hauteur-9,"surfmaths.free.fr",$b); imagestring($image2,1,$largeur*$longueur-86,$hauteur-8,"surfmaths.free.fr",$b); imagestring($image2,1,$largeur*$longueur-86,$hauteur-10,"surfmaths.free.fr",$b); imagestring($image2,1,$largeur*$longueur-86,$hauteur-9,"surfmaths.free.fr",$n); // ---- Sauvegarde du mot ---- /* Cette partie n'est pas faite. Je vous conseille de sauvegarder la variable $mot dans une session afin de pouvoir la réutiliser sans que l'utilisateur n'en connaisse le contenu ce qui permet de détecter si la lecture de l'image à été faite par un robot.
  • /
// ---- Affichage du résultat ---- header("Content-type: image/png"); // Entête spécifiant le type de l'image imagepng($image2); // Affiche le résultat imagedestroy($image); // Supprime l'image originale imagedestroy($image2); // Supprime l'image finale ?>

Conclusion :


Pour avoir la dernière version de se code source je vous conseille de faire un tour sur mon site dans la section téléchargements : http://surfmaths.free.fr/

J'ai mis autant de commentaires que possibles, si vous ne comprenez pas, demandez moi, j'essaierai de vous expliquer.

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.