Un captcha infaillible ? (4235 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.

11.  posté le 10/01/2009 par jeremy

Il faut bien avouer que cette astuce est énorme
quand on voit le nombre de spamm que l'on peut
récolter un très peu de temps.

J'ai fait l'erreur sur le forum PHPbb d'un ami d'ommetre
le captcha...

12 000 posts en un mois ... Que du spam...

Je vais reprendre rapidement cette astuce ;)

Merci

Jérémy

12.  posté le 11/01/2009 par Fred

@Jérémy
Attention, car phpBB est réputé (était ?) pour avoir de nombreuses failles, et les forums en général doivent recevoir des règles anti-spams bien plus fortes que celle décrite dans cet article.

13.  posté le 28/01/2009 par original

Question peut-être étrange, mais pourquoi n'as-tu pas installé ton système sur cette page au vu de ton article. Je me triture le cerveau à calculer 17+14 ;).

14.  posté le 29/01/2009 par Fred

@original
Le système existe sur la page contact de ce site.
Par ailleurs, ce site étant aussi un "labo", j'ai installé un autre système pour les commentaires, ce qui permet d'ailleurs de pouvoir comparer les deux systèmes.
Enfin, un peu de calcul mental n'est jamais mauvais pour la santé ; ça m'évite comme ça les skybloggueurs :p

16.  posté le 09/02/2009 par oldergod

Pardon de poser ca mais quelles sont a peu pres tes stats de visites/jour et tu n'as toujours jamais eu de probleme avec le systeme de la balise hidden?

17.  posté le 09/02/2009 par Fred

@oldergod :
Je ne comprends pas ta question.
Quel problème serais-je susceptible d'avoir avec "hidden" (qui n'est pas une balise) ?
N'oublions pas le but de cet article : apprendre à faire au plus simple et accessible au lieu de toujours sortir, parce que le web est 2.0, l'artillerie lourde.
Mon message était celui-ci : un mauvais captcha (dans le sens accessibilité) va avoir beaucoup de chances d'être rejetté et abandonné par l'utilisateur. C'est donc un échec de la convertion (d'un formulaire). Un bon captcha (accessible et simple) ne bloquera jamais les convertions de formulaires. Au pire il restera une couche de nettoyage des spams, ce qui peut encore être automatisé.
De nombreux gros portails utilisent aujourd'hui des captchas visuels très difficiles à décrypter, même pour une personne voyante.
Si après deux ou trois tentatives le formulaire vous répond toujours que le captcha n'est pas bon, il va rester peu de personnes pour insister.
Que vaut-il mieux ? Un captcha très fort, tellement fort que même les humains ne le passent pas ! Ou un captcha qui ne doit poser aucun problème aux humains, quitte à laisser passer du spam qui je le répète peut encore être filtré côté serveur.

18.  posté le 15/03/2009 par xav

Bonne démonstration mais tu n expliques pas comment vérifier que le champ reste vide.

Quel est le code à mettre dans le php pour controler cela ?

19.  posté le 16/03/2009 par Fred

@xav
Je ne pense pas qu'il soit nécessaire de mettre ici comment on vérifie en PHP qu'un champ envoyé par la méthode POST est bien vide. C'est élémentaire ;)

20.  posté le 16/03/2009 par xav

Ben oui mais c'est dommage tu mets que la moitié de la méthode les gens comme moi qui savent pas faire de php on peut pas mettre en place ta méthode.

21.  posté le 17/03/2009 par Fred

@xav
"tu mets que la moitié de la méthode"
Non, je met la totalité de la méthode. Le traitement serveur ne fait pas parti de l'article, car il peut être en php, en asp, en python, en ruby ou n'importe quoi d'autre.

22.  posté le 18/05/2009 par Banvert

C'est très sympa ton idée mais assez frustrant...
je suis d'accord avec xav : tu mets quand même que la moitié de la méthode car on reste bloqué !
Est-ce que tu ne pourrais pas indiquer comment faire le traitement serveur au moins en php (le plus courant).
Merci en tout cas si tu as la gentillesse de le faire, pour tous ceux qui sont débutants.
Merci et @+

23.  posté le 20/05/2009 par Fred

@Banvert
Je vous invite à vous orienter vers des sites comme :
http://www.phpdebutant.org/
http://www.phpfacile.com/
http://www.siteduzero.com/
Il ne sert à rien de vouloir commencer à faire un formulaire avec captcha si vous ne savez (à priori) pas comment contrôler l'intégrité des variables postées par les formulaires.
C'est le B.A.-ba de PHP et ça ne reste pas compliqué. Sans cela, vous ouvrez des failles de sécurité importantes.

24.  posté le 16/07/2009 par Michael

Bonjour, j'ai un forum SMF pour un club de tennis de table. Depuis plusieurs mois, malgré la mise en place du captcha "standard" de SMF, de nombreux bots arrivent à s'inscrire sur le forum. Pour l'instant ça ne pose pas de problème car je dois valider l'inscription de toutes les personnes s'inscrivant.

Mais j'aimerais, pour attiré un peu plus les gens du club sur le forum, ne pas devoir faire cette validation, ce qui reviendrait à accepter l'inscription des bots... Il me faut donc un autre captcha. J'ai pensé à celui dont tu parles dans l'article. Mais est-il assez efficace ?

Il "suffirait" que le robot ne prennent pas en compte les éléments du formulaire qui ont l'attribut "hidden". Il me semble que ça doit être facile à mettre en place pour un hacker.

25.  posté le 17/07/2009 par Fred

Bonjour Michael,

Pour un forum, il faut se tourner vers les plugins spécifiques développés pour lui.
Je ne sais pas si tu as été voir du côté anglophone de SimpleMachines, mais je vois beaucoup de plugins de sécurité anti-bot ou captcha, forcément plus évolués que ce que je présente.
http://custom.simplemachines.org/mods/index.php?action=search;type=13

Fred

26.  posté le 17/07/2009 par Michael

J'avais déjà inclus l'un de ces anti-bot pour la nouvelle version de mon site. (un anti-bot qui génère plusieurs types de question dont des petits calculs). J'ai rajouté en plus un champ email hidden, et renommer le champ email comme expliqué dans ton article

On verra une fois la nouvelle version du site en ligne, si les robots arrivent toujours à s'inscrire... Sinon, je reviendrai pour me plaindre :)))

Merci pour les infos

27.  posté le 17/07/2009 par Fred

Il n'y a pas de secret aujourd'hui, et on le voit bien avec les très nombreux webservices qui utilisent des captchas visuels totalement illisibles, avec une option vocale défaillante.
Pour qu'il soit efficace (vriament) il faut qu'il soit complexe, mais il faut user de subtilités pour éviter le plus de désagrément à l'utilisateur.
On pourrait imaginer un système visuel de cartes qui sont mélangées aléatoirement, l'utilisateur devant cocher la couleur (ou genre) de la carte affichée.
L'exemple est sympa, mais une chance sur quatre n'est pas suffisant comme anti-spam, il faut trouver mieux tout en restant très simple pour l'utilisateur.

28.  posté le 29/10/2009 par Eric

Bonjour,

Super idée !
Il y a eu des retours ? Ça marche vraiment bien ?

29.  posté le 07/05/2010 par François

Bonjour,

C'est vrai que sur une telle idée, on aimerait avoir un retour d'expérience au bout de quelques années.

Et une comparaison avec la solution des commentaires.

Qu'est-ce que je peux être exigeant!

:)

30.  posté le 07/05/2010 par Fred

@François

Je ne sais pas quoi répondre...
Depuis que ce système est installé sur ce site (page contact uniquement > cf précédent commentaires pour expliquer pourquoi), j'ai 0% de spams. (forcément, ça ne demande que de la confiance).
C'est aussi vrai sur les commentaires d'un article, mais eux reçoivent une autre logique anti-skyblog (1+1=?).

Fred

31.  posté le 08/05/2010 par Sumbang

Bonjour, je trouve votre idée de captcha vraiment bonne. Elle est assez simple et semble très pratique.

Dans le cadre du developpement de mon site web, j'ai pensé à une façon de faire un captcha. Bon moi j'ai opté de générer un mot aléatoire en PHP que j'affiche à l'utilisateur. C'est ce mot la qui me sert de captcha.

Sachant que le mot est généré par mon serveur, son code ne devrait pas pas en principe être visible par le robot.

Bon dites moi ce que vous en pensez !!

32.  posté le 08/05/2010 par Fred

@Sumbang
"Sachant que le mot est généré par mon serveur, son code ne devrait pas pas en principe être visible par le robot."
--------
Mais tout est généré par le serveur de toute façon, et je ne vois pas en quoi ça serait utile dans ce cas ? Vous n'avez pas un exemple concret à voir ?

Mais en suivant votre idée, et pour rester accessible, il suffirait comme vous le faites d'afficher un mot, choisit aléatoirement sur une liste de mots, et de demander par exemple de réécrire le mot sans sa première lettre (par exemple), puis de contrôler côté serveur le résultat.
Comment un robot peut-il lire et comprendre la phrase clé et l'interpréter ?

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 6 plus 17 est égale à