Deblan blog

Contrer des robots stupides sans captcha

Ceux qui côtoyaientt mon ancien blog devaient rentrer un captcha pour poster un commentaire.

Le problème c'est que personnellement, ça me gonfle de me cogner une image presque illisible à lire pour un simple message. Seulement il y a toujours et encore nos amis les robots pour casser l'ambiance.

Comment bloquer ces robots sans captcha ?

Pour vous j'ai une astuce simple qui depuis 2 jours a permis de bloquer un peu plus de 300 robots (tout les robots qui ont essayé de poster d'ailleurs).

Cette technique ne fonctionne que pour les robots complétements cons et qui ne sont pas développés spécifiquement !

Étape 1 : créer une page dédiée à la gestion des robots

Vous devez (pouvez) créer une page qui va réceptionner les robots détectés et qui leur laissera un joli message de bienvenue. De mon coté, j'ai aussi décidé d'enregistrer les informations réceptionnées ($_POST, $_GET, $_COOKIE, $_SERVER).

J'ai décidé de rendre accessible cette page avec l'url "/bot"

Étape 2 : préparer les formulaires à sécuriser

Comme je l'ai écrit, c'est simple et pour ce faire, il suffit d'ajouter l'url de la page pour les robots dans l'action du formulaire.

Par exemple, voila ce que vous trouverez dans le code source de ce blog :

<form method="post" id="comment_form" action="/bot?/post/429/Contrer-des-robots-stupides-sans-captcha#comment_form" enctype="multipart/form-data">

Il vaut évidement remarquer le "/bot?" ajouté à la vraie action du formulaire.

Étape 3 : owned le bot

Comme les robots sont cons et qu'ils sont souvent démunis d'un tas d'outils, il suffit d'utiliser l'un d'eux : javascript.

Pour se faire, on va définir que si la personne bouge la souris sur la page, alors elle n'est pas un bot. Par conséquent, il suffit de supprimer "/bot?" de l'action du formulaire :

<script type="text/javascript">
$(document).ready(function() {
	$(document).mousemove(function() {
		var action = $('#comment_form').attr('action').replace(/^\/bot\?/, '');
		$('#comment_form').attr('action', action);
	});
});
</script>

Edit : Une optimisation du code a été proposée par GromNaN et je la préconise. La voici :

<script type="text/javascript">
$(document).ready(function() {
	$(document).one('mousemove', function() {
		var $form = $('#comment_form');
		var action = $form.attr('action').replace(/^\/bot\?/, '');
		$form.attr('action', action);
	});
});
</script>

Rien de plus simple et ça semble très bien fonctionner.

Seul petit bémol : ça implique que les internautes ont le javascript activé.


  • Hadrien
    • ,
    • C'est pas con, je kiff le concepte ! je garde ça sous le coude =)
  • Jeremy
    • ,
    • sympa, une solution simple à mettre en place en plus!
      mais :
      - es-tu sur qu'aucun bot n'éxecute le javascript maintenant? par exemple google en exécute pas mal j'ai l'impression. (même si je suis bien consciens qu'un bot de spam n'est pas du niveau de google, je m'interroge!?)
      - Et ca manque un peu d'optimisation JS toute conne : par exemple, un petit boolean pour tester si on a déjà fait la modif de l'attribut, parce que toucher au DOM en JS, en plus dans un mousemove qui est déclenché un paquet de fois à la seconde, ca peu devenir lourd, donc autant le faire qu'une fois! Ou alors mieux, supprimer l'évenement là premiere fois qu'il est déclenché, avec un bind('mousemove'..) et un unbind('mousemove') dans l'écouteur pour l'enlever!

      A+
  • Benji
    • ,
    • Pour l'optim, le mieux c'est de supprimer l'évènement mousemove lorsque la détection a été faite, comme ça il ne sera plus appelé du tout.
  • Simon
    • ,
    • Effectivement, le traitement de l'event peut être optimisé, je ferai une maj de l'article ^^
  • Jeremy
    • ,
    • Oé en fait j'ai pas trop réfléchis, je viens de mieux comprendre ton truc, même si les bot exécutent le javascript y'a peu de chance pour qu'ils déclenchent l'événement mousemove... Bien vu! J'annule ma premiere remarque du commentaire précédent!
  • Jeremy
    • ,
    • Encore une remarque, je suis un peu chiant ^^
      niveau accessibilité, est t'on sur que tout le monde à une souris, exemple, une personne aveugle, avec un navigateur vocal, va naviguer au clavier, et donc ne passera pas ce test de mousemove, donc peut etre rajouter un event keydown (mais là encore, est ce que un bot ne va pas le déclencher?).. hurmf

      Sinon, on m'avait parlé d'une solution sympa, et qui ne demande aucun effort à l'utilisateur aussi, c'est de mettre un champ "email" par exemple, en display none, le bot va voir ce champ dans le DOM et betement le remplir, alors qu'un humain ne le vera pas et donc le laissera vide. Après coté php, plus qu'a tester si le champ a été rempli ou non!
  • Simon
    • ,
    • Cette astuce fonctionne mais je pars du principe que je n'ai pas envie de modifier ma conception (dans le dev php) pour les bots. L'idée en Symfony est qu'on décrit des données de formulaire et leur outils de validation. Quand bien même ça serait ultra rapide d'ajouter un champ et de le contrôler comme tu le décris, si demain je veux utiliser une autre méthode, je dois me cogner du php.

      Une petite note au passage (avant que je maj l'article), si on a de la génération post chargement de la page de formulaire, il peut-être intéressant de ne virer l'écouteur d'event que sur les formulaires déjà traités ^^
  • frinux
    • ,
    • Bonne astuce, mais effectivement je pense que c'est côté accessibilité que ça coince. Il faudrait en fait être indépendant de Javascript pour que ce soir complètement accessible.
  • Simon
    • ,
    • Complètement accessible et transparent pour l'utilisateur aussi. Je détester devoir prouver explicitement que je ne suis pas un robot.
  • Benji
    • ,
    • Au niveau accessibilité les captchas ne sont pas toujours très optimisés : si certains proposent des lecteurs audio, dans ce cas il faut avior javascript pour que ça fonctionne... on tourne en rond. Tout est une question de choix, par contre si qqchose existe de vraiment accessible, ça m'intéresse.
  • Fiyery
    • ,
    • Bonjour,
      Pour apporter des éléments de réponse à Jeremy, j'ai testé la technique du champ caché et cela fonctionne parfaitement depuis le début de Février : Plus aucun bot-spammeur ne poste de commentaire. Par contre, avec la même méthode sur un autre site, les bots parviennent à passer. On peut donc dire que cette méthode solide (même si aucune méthode n'est parfaite).
      Par contre, pour la méthode de cette article, je pense qu'il y a de bonnes possibilités.
      Je remercie donc son auteur pour cette méthode (même 2 ans après).
      .
  • Fiyery
    • ,
    • * Je disais que la méthode de champ caché n'est pas si fiable que ça.
  • Seoxis
    • ,
    • facilement contrable avec zennoposter :)

      disons que comme presque personne ne l'utilise , tu as un peu de marge devant toi

Ajouter un commentaire

Vous pouvez utiliser du markdown.Afficher l'aide.