Antispam pour les commentaires de blog : un Captcha sans images

Captcha antispam pour blog

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.


Captcha antispam pour blog

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

Outil de référencement professionnel - essai gratuit Ce contenu a été publié dans Webdesign, avec comme mot(s)-clé(s) , , , , , . Vous pouvez le mettre en favoris avec ce permalien.

14 réponses à Antispam pour les commentaires de blog : un Captcha sans images

  1. André dit :

    Excellent sujet

  2. Pierre-Marie dit :

    Moi j’aime bien le captcha que tu utilises actuellement, à savoir celui qui pose une question qui est (normalement) impossible à résoudre par les bots (à plus forte raison quand le bloggueur rédige lui-même les questions qui sont donc inédites).
    Ça me semblera toujours plus convivial et rapide que la série de caractères qu’il faut taper avec attention. Même si l’approche utilisée pour le rendre indétectable par les bots est très intéressante, et l’article en lui-même indique beaucoup de choses :)

  3. Raton dit :

    Bonjour,

    Je ne comprends pas bien comment ce test fait la différence entre les humains et les robots ? Le texte à recopier est affiché en clair, donc le robot n’a aucun mal à le reproduire. A partir de là, le mot étant correct il sera forcément validé, peu importe qu’il ait été entré par un humain ou un robot. Et le md5 étant basé sur le mot tapé, il sera aussi forcément correct…

  4. Damien Ravé - Le Caphar dit :

    @raton : le principe, c’est que ce texte n’est pas identifié comme un captcha. Si le robot est doté d’un système de reconnaissance optique de caractères (OCR), il cherchera une image qui n’existe pas. Du coup le robot ne « sait » pas où chercher le bloc de texte, et même s’il trouve l’identifiant du bloc une fois, la fois suivante ce dernier aura changé puisqu’il est aléatoire. Il lui reste à essayer tous les bouts de texte présents dans la page. Bien sûr si cette technique devenait massivement utilisée, les robots s’adapteraient, mais pour un « petit » blog ce système est assez efficace.

    Mais avant qu’on en soit là, il y aurait des manières de compliquer la tâche des robots : par exemple en ajoutant des <span> autour de chaque caractère, qui en font des éléments distincts dans le code mais ne changent rien pour le lecteur. Pour le troubler encore un peu, on pourrait intercaler entre les lettres des caractères dans des <span> invisibles (display:none ou color:#fff) : le robot les lirait mais le visiteur ne les verrait pas.

    Pour la démonstration, ça fait trois mois que j’ai utilisé le système de base sur le site d’une revue qui reçoit 10000 visiteurs par mois et une bonne dose de robots, et aucun spam n’est à signaler (je n’ai pas beaucoup de commentaires non plus, mais quand même quelques-uns, donc ça marche).

  5. Sylvain dit :

    Et la technique du input rendu invisible par le css et si il est rempli (donc par un robot) le formulaire ne passe pas ?

  6. Raton dit :

    Ah, je comprends mieux. En fait c’est l’originalité du captacha qui fait sa force, les robots visent le plus grand nombre et ne se couvient pas des dispositifs personnels.

    La méthode des lettres cachées en CSS a les avantages du captcha image (illisible pour les robots) sans les inconvénients (pas de lettres tordues ou brouillées). Il reste un problème, les navigateurs en mode texte verront toutes les lettres et ne pourront pas passser le test. Mais ça reste une excellente solution, facile à mettre en place et efficace.

    A +

  7. Raton dit :

    Autre chose que j’ai oublié : les question posées en toutes lettres ("combien font deux plus cinquante-sept") peuvent poser problème pour les visiteurs étrangers. La compréhension générale permet de lire un site mais ne suffira pas forcément pour répondre à la question.

    (Faute de frappe dans mon commentaire précédent : il faut lire "soucient" et pas "couvient")

  8. Kijer dit :

    Salut,

    on m’a de mon coté présenté une manière de diviser grandement le spam en ajoutant simplement une champ imput text, puis via css le mettre en display:none;.

    Résultat si un visiteur rempli un commentaire, il ne verra jamais ce champ non visible, donc ca submitera sans le remplir, ensuite un bot par contre le verra dans la source et le remplira surtout si on lui met un nom du genre : website , ensuite a nous de refuser l’envoi du com’ si ce champ est rempli =)

  9. Damien Ravé - Le Caphar dit :

    @kijer : C’est la suggestion de Sylvain, que je viens tout juste de mettre à l’essai sur ce blog. J’aime beaucoup l’idée parce que ça n’impose pas de charge supplémentaire aux utilisateurs humains. Mais cela ne suffit pas : je la complète avec Spamplemousse. Je teste également un système de scoring qui permet d’évaluer les chances qu’un commentaire soit un spam. L’objectif, c’est de filtrer en amont de Spamplemousse afin d’avoir une file de modération de taille raisonnable (200 spams à traiter par jour, c’est pas humain).

  10. fabrice jacob dit :

    excellent article, merci pour les commentaires aussi !

  11. simo dit :

    merci pour l’idée je l’es adapté ca marche trés bien jusqu’à mnt .
    je peux pas vous donnez le lien du site car je ne suis qu’un developpeur en sein d’une entreprise est c interdit dans notre lois interne que je livre le lien des site que nous réalisons mais en tous cas merci bien

  12. Pierre dit :

    Et si le pirate décide d’aller dans le code source pour créer un robot spécial pour le site ?

  13. Le Caphar Damien Ravé dit :

    @Pierre : dans ce cas, tu es suffisamment important pour avoir les moyens de développer un Captcha plus efficace.

    Ma solution s’applique aux blogs et sites de taille moyenne, qui sont victimes de spam « générique » (pubs Viagra et companie) en masse. Pas aux ennemis déterminés qui veulent absolument passer à travers le filet.
    Bien sûr, si cette solution devenait un standard, je suppose que des robots se développeraient pour la prendre en défaut, mais on n’en est pas là. Restons underground.

  14. Jean dit :

    Technique simple à mettre en place qui me parait efficace pour le blocage des spams.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *