Antispam pour les commentaires de blog : un Captcha sans images
Par Damien Ravé - Le Caphar, jeudi 6 mars 2008 à 23:11 :: Webdesign :: #112 :: rss
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 :
<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. Je n'ai pas encore pris le temps de développer un plugin pour blogs, ma version de Dotclear étant vieillissante. 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...
Articles traitant des mêmes sujets
- Des tableaux de données simples, standards et lisibles en CSS et PHP
- Déboguer les erreurs MySQL grâce aux alertes e-mail
- Erreurs 404 : faites la chasse aux pages perdues
- Je recrute : un(e) webdesigner-développeur-ergonome-architecte ambitieux, communicant et souriant (IDF)
- 7 pratiques Javascript qui changent la vie
- Astuce PHP : afficher ou masquer le "s" de résultat(s) en une ligne
- Comment ne pas gagner d'argent en créant un jeu en ligne
- 10 fonctions PHP-MySQL que j'utilise tous les jours

Scoop it!
Tape Moi!
Nuouz Ca!
Fuzz it!
Memes Ca!
Abonnez-vous au flux RSS !

Commentaires
1. Le vendredi 7 mars 2008 à 00:17, par André
2. Le samedi 8 mars 2008 à 06:33, par Pierre-Marie
3. Le dimanche 16 mars 2008 à 01:20, par Raton
4. Le mardi 18 mars 2008 à 07:43, par Damien Ravé - Le Caphar
5. Le dimanche 30 mars 2008 à 16:53, par Sylvain
6. Le lundi 31 mars 2008 à 18:35, par Raton
7. Le lundi 31 mars 2008 à 18:43, par Raton
Ajouter un commentaire