Un captcha infaillible ? (611 lectures)

200802/10

captchaLe spam est désormais un fléau qui touche qui touche tout le monde, que ce soit sur la messagerie électronique ou sur les sites web à travers leurs commentaires.
Pour lutter contre celà, les développeurs se sont armés de patience et ont conçus des filtres anti-spams de plus en plus complexes, mais qui sont malgré tout déjoués par les robots.

Et si le meilleur anti-spam de commentaires n'était pas le plus simple, tel que celui que j'utilise pour ce site depuis deux ans avec 100% de réussite ?

Rappel sommaire 

Le captcha est l'acronyme de l'anglais « Completely Automated Public Turing test to Tell Computers and Humans Apart », soit en français, « test public de Turing complètement automatique ayant pour but de différencier les humains des ordinateurs ».

Il a été créé afin de lutter contre les messages envoyés par des robots à travers les formulaires web ou les commentaires de blogs.

Des captchas, il en existe de toutes sortes, simples questions demandant une réponse, type "Quel est la couleur du cheval blanc d'Henri IV ?", aux captchas blindés, mais non accessibles, type captcha image avec des caractères alpha-numériques déformés, très souvent difficiles à lire et donc à reproduire.

91% des commentaires laissés sur les blogs seraient du spam et 9 bits sur 10 du trafic email serait aussi du spam, rendant celui-ci l'ennemi public numéro 1 du web.

Pourtant, une équipe de l'Université de Californie de Berkeley a réussi à mettre au point un robot capable de déjouer 92% des systèmes anti-spam, faisant de ceux-ci des filtres inutiles à court ou moyen terme.

Notre système, simple et efficace

Adepte des bonnes pratiques web, j'ai souvent cherché comment mettre en place un captcha simple mais efficace, accessible, et surtout qui ne rebute pas celui qui doit soumettre un formulaire, en lui demandant de répondre à une question parfois tordue, comme : "Quel est le le 8ième caractère mois 3 caractères de la phrase : Un petit bonhomme en mousse ?".
Déjà qu'on a passé bien souvent du temps à remplir nos formulaires, voilà que la dernière question vous oblige en plus à remuer vos méninges, de quoi quitter le site, non ?

Aussi je suis parti d'un constat simple :

  • si le spammeur est un humain, on pourra lui mettre tous les captchas du monde, ils ne seront d'aucun effet,
  • si le spammeur est un robot, il doit nécessairement obéir à une certaine logique,
  • cette logique, c'est celle qui conduit à priori un robot à remplir automatiquement tous les champs d'un formulaire.

Avec cette idée, j'ai donc pensé à placer un champ caché à l'intérieur du formulaire, et tant qu'à faire à nommer ce champ 'email' afin de berner le robot.

 

  1.  <input type="hidden" name="email" value="" /> 

Ainsi, le robot devrait naturellement remplir ce champ, et s'il est configuré pour remplir plus facilement un champ nommé 'email', il va encore plus tomber dans le piège.

Côté serveur, il ne reste plus qu'à traiter le champ 'email' et vérifier qu'il soit vide !

S'il n'est pas vide, c'est nécessairement un robot puisqu'un visiteur (humain) ne doit pas voir (et donc remplir) ce champ.

Jusqu'alors, cette méthode se révèle efficace, et je ne reçois aucun spam

 

Dernière modification : 30/11/2008

Catégorie : Développement PHP/MySQL - Web -

A découvrir également :

 

TuttifruttiCake : un CMS propulsé par le framework Cake PHP

Ou en sont les solutions e-commerce Open Source actuelles ?

Commentaires

1.  posté le 10/10/2008 par D'g

Bonne analyse, une fois de plus c'est la méthode la plus simple qui est la plus efficace.
Reste plus qu'à le mettre en place ici ;-)
Bonne continuation

2.  posté le 10/10/2008 par Fred

"Reste plus qu'à le mettre en place ici ;-)"

Il est en place, sur la page contact.
Il suffit de voir le code source.

3.  posté le 20/10/2008 par Bernard

Bonjour,
Je ne comprends pas où tu places ton champs caché exactement ?
Merci

4.  posté le 20/10/2008 par Fred

Ca n'a aucune importance, à partir du moment où ce champ est dans le formulaire.

5.  posté le 27/10/2008 par koko

bonjour,

Merci pour cette info très utile qui tombe à pic :-) car certains captchas visuels ne sont pas au point à mon avis et donc je cherchais une alternative pour créer mon formulaire.

J'ai pourtant une très bonne vue mais il m'est arrivé sur certains site d'obtenir le message d'erreur "le code de vérification que vous avez entré est incorrect" et j'avais beau retaper le nouveau code (vu qu'il rafraîchissait l'image)... à la fin, vous vous en doutez bien, j'ai quitté le site sans remplir ce fichu formulaire qui me tapait sur le système !!

Donc, je voudrais éviter cela dans mon formulaire car je me dis que si cela m'est arrivé, je ne suis probablement pas la seule et pas envie de rebuter mes visiteurs !

Fred, j'aurai cependant une petite question : j'ai donc consulté le code source de cette page et je me suis rendu compte que la vérif de la saisie du formulaire se faisait en js et ma question est donc "la vérification en js fonctionne-t-elle si le visiteur a désactivé le js ?" car j'étais partie à la recherche d'un script php pour assurer ce rôle de peur que le js ne l'assure pas en cas de désactivation du visiteur.

6.  posté le 27/10/2008 par Fred

@koko
La vérification des champs saisis dans les commentaires de cette page ne se fait pas en javascript mais en php.
Et puis, il suffit de désactiver le javascript pour s'en rendre compte.
Pour cela, il faudra installer la webtoolbar. Faites une recherche sur le site avec le terme 'webtoolbar' pour avoir les liens de téléchargement sur Firefox, IE ou Opera.

Enfin, il est courant d'utiliser javascript pour vérifier les formulaires, c'est rapide (surtout avec JQuery) et sexy, mais il faut toujours les vérifier aussi avec PHP si javascript est désactivé.

7.  posté le 17/11/2008 par Calibhaan

Bonjour,

Je recherchais une bonne idée pour un captcha, et je chercher un alogrithme permettant d'etre le plus puissant possible pour ne pas gener l'utilisateur et bloquer les spam-bot.

Et la bravo.

Grâce à ton analyse et ton exemple, je suis parti à réfléchir dessus, et je peux te donner quelques ajouts possibles...

rajouter dans le css:
input.hideInput {
display: none;
}

et pour ton code HTML :

<input class="hideInput" name="email" value="" />

L'avantage est de pouvoir cacher le fait que ton input ne s'affiche pas.
De plus tu peux nommer le vrai champ de l'email de façon aléatoire et garder son nom en session...

Voila.

8.  posté le 17/11/2008 par Fred

@Calibhaan
Je ne comprends pas trop pourquoi tu ajoutes une couche de CSS pour masquer ton champ alors que le fait de lui donner une valeur hidden à l'attribut type fait qu'il sera masqué par défaut, et ce quelque soit le moteur de rendu du navigateur (braille ou visuel).
Avec ta méthode, un navigateur braille ne va pas lire la CSS et celui qui veut poster un commentaire va naturellement remplir le champ et voir son commentaire rejetté.

Après, il en existe beaucoup d'autres aussi.

On aurait pû mettre le champ entre des balises commentaires html.
On aurait pû mettre un textarea (entre des balises commentaires) avec du texte dedans, comme : "Ne surtout pas modifier ce texte, il sert à filtrer les robots spammeurs", puis vérifier côté serveur si ce texte a été modifié.

Comme les robots spammeurs aiment à insérer plein de texte indésirable dans les champs type textarea, ils seront rejettés.

Evidemment, tout ceci ne filtera jamais le spammeur "humain", ni un robot "intelligent".

Pour l'instant, cette méthode porte ses fruits.

9.  posté le 18/11/2008 par Calibhaan

Effectivement je n'avais pas pensé au lecteur braille...
Donc ta méthode est bien comme elle est.

Ajouter un commentaire

Les champs en gras sont obligatoires.

Commentaire:

Anti-spam :
Veuillez répondre à la question suivante avant de valider votre commentaire.

La somme de 13 plus 17 est égale à