Les spams dans les commentaires de blogs sont une plaie. Divers tests de Turing (aussi appelés Captchas) visent à séparer les robots des êtres humains, allant de l'image plus ou moins lisible au questions les plus absconses (« quel est le troisième chiffre dans la chaîne 012345 (en chiffres) ? »). Voici une méthode, simple et, d'après mon expérience, plutôt efficace pour tromper les spammeurs. Explications.
Les spams dans les commentaires de blogs sont une plaie. Divers tests de Turing (aussi appelés Captchas) visent à séparer les robots des êtres humains, allant de l'image plus ou moins lisible au questions les plus absconses (« quel est le troisième chiffre dans la chaîne 012345 (en chiffres) ? »). Voici une méthode, simple et, d'après mon expérience, plutôt efficace pour tromper les spammeurs. Explications.
Le principe : un bloc de texte anodin
Le principe est simple : afficher une suite de caractères, comme ci dessous :
AHKIPO8<style>
#yzzera {
font-size:3em;
margin:1em;
text-align:center;
}
</style>
<div id="yzzera">AHKIPO8</div>
Il s'agit d'un simple div dont la taille a été agrandie pour qu'il soit facilement identifiable par les visiteurs de votre blog. Pour s'assurer qu'un robot ne puisse pas détecter qu'il s'agit d'un Captcha, on lui attribue un id généré aléatoirement, et l'on définit son style dans la page. Si vous ne pouvez pas modifier l'en-tête de la page pour inclure la balise <style>
, vous pouvez spécifier directement le formatage avec l'attribut style="font-size:3em"
, mais c'est moins propre.
Comment générer les codes aléatoires ?
Personnellement, j'utilise des fonctions très basiques de génération de code aléatoire :
function consonne() { $consonnes = "bcdfghjklmnpqrstvwxz"; return $consonnes[rand(0,strlen($consonnes) - 1)]; } function voyelle() { $voyelles = "aeiouy"; return $voyelles[rand(0,strlen($voyelles) - 1)]; } // Je génère le nom du DIV $captcha_div = voyelle() . consonne() . consonne() . voyelle() . consonne() . voyelle(); // Je génère le captcha $captcha = strtoupper(voyelle() . consonne() . consonne() . voyelle() . consonne() . voyelle()) . rand(0,9);
Valider le tout
Pour vérifier que le Captcha a été correctement saisi par le visiteur, il faut que le formulaire comprenne au moins deux champs :
- le champ de saisie pour le visiteur :
<input type="text" name="saisie_utilisateur">
- un champ invisible, comportant une version "hachée" du Captcha : une simple fonction md5() suffira à rendre le code indéchiffrable. On aura donc un champ de ce type :
<input type="hidden" name="hachage_code" value="<?php print md5($captcha); ?>">
A la validation du formulaire côté serveur, la saisie du visiteur sera à son tour passée à la moulinette du md5() et comparée à la valeur $_POST['hachage_code']
. Si elle est identique, c'est que le visiteur a correctement recopié le code. Et hop, le commentaire est enregistré ! Si elle est différente, c'est que le visiteur n'a pas recopié le code convenablement. Il faudra donc réafficher le formulaire en reprenant toute la saisie du visiteur, et générer un nouveau code aléatoire, qui sera vérifié après une nouvelle validation, etc.
Renforcer la protection
Si l'algorithme de vos spammeurs est très malin, on peut renforcer la difficulté en ajoutant des <span> autour de chaque caractère. Sur des sites de taille raisonnable, les techniques des spammeurs ne sont pas très élaborées. Je recommande quand même de compléter cette barrière par un filtre antispam par mots-clés qui met en attente de validation les commentaires comportant certains caractères. D'autres techniques existent, notamment les systèmes de scoring, mais ils sont plus complexes à mettre en place.
Vos retours
Cette méthode est en cours d'expérimentation sur un des sites que j'administre. Si vous la mettez en œuvre avec succès, faites-moi signe. Si c'est un échec complet, vos retours sont intéressants aussi. Et si vous avez des suggestions d'améliorations, c'est encore mieux. A votre bon cœur, messieurs dames...