Informations et liens

Autres billets
Peut-on améliorer les services Google ?
Courrier des lecteurs

Un antispam qui fonctionne (vraiment) ?

Le 21 mai 2008 à 23:52

Comment régler le problème des spams sur les blogs, malgré des plugins normalement performants (Akismet) ou des captchas, malheureusement contraignants et rarement accessibles (si toutefois l’accessibilité vous préoccupe) ?

Comme tout le monde ou presque, et malgré un faible trafic sur ce blog, j’ai eu droit à des quantités de spam hallucinantes qui ont de quoi dégouter…

C’est suite à un billet de Julien Tartarin, il y a déjà quelques temps, que j’avais mis en place sa solution d’antispam qui fonctionne : placer un champ supplémentaire dans le formulaire de commentaires, cacher ce champ en CSS et vérifier à la validation du formulaire si le champ caché est rempli. Si le champ est rempli alors qu’il est invisible, c’est que le formulaire a été rempli par un bot. Côté PHP, il suffit alors d’appliquer la conditionnelle qui va bien pour envoyer bouler notre spam.

Concrètement, sous Wordpress, ça donne ça :

HTML

<p class=”bots_debiles”><input type=”text” id=”yippie-kay” name=”yippie-kay” value=”" />
<label>Bot or not ?</label>
</p>

CSS

.bots_debiles { display: none; }

PHP (wp-comments-post.php)

$comment_bots = trim($_POST['yippie-kay']);
if ( !empty($comment_bots) ) {
wp_die( __(’Sorry, you must be logged in to post a comment.’));
}

On vérifie donc que la valeur de $comment_bots n’est pas vide, et on renvoie un message d’erreur quelconque.

Bon, le problème, c’est que cet antispam super efficace n’a pas fonctionné sur du long terme. Je n’ai pas encore étudié le pourquoi du parce que… mais j’ai vu que Cédric Bidet a également eu le problème après avoir positionné cette solution sur son blog. Ce dernier a alors poussé le système un peu plus loin. Celui-ci consiste à modifier une valeur du formulaire (pourquoi pas le champ caché précédemment) lors du clic sur le bouton de validation, bouton qui n’est pas pressé par un bot.

HTML

<p class=”bots_debiles”><input type=”text” id=”yippie-kay” name=”yippie-kay” value=”" />
<label>Bot or not ?</label>
</p>
[...]
<input type=”submit” id=”input_comments_submit” name=”submit” value=”Envoyer” onclick=”javascript:this.form.yippie-kay.value=’jeNeSuisPasUnBot’; this.form.submit();” />

Si votre template contient une conditionnelle $user_ID pour vérifier si vous êtes bien identifié, il sera nécessaire d’insérer également le champ caché dans la conditionnelle. Si le champ n’existe pas, il sera impossible d’en modifier la valeur à la validation du formulaire… Vous retomberiez alors sur votre page d’erreur !

PHP (wp-comments-post.php)

$comment_bots = trim($_POST['yippie-kay']);
if ( empty($comment_bots) ) {
wp_die( __(’Sorry, you must be logged in to post a comment.’));
}

On vérifie désormais que $comment_bots est bien vide : puisque notre javascript lui insuffle la valeur “jeNeSuisPasUnBot” à la validation du formulaire, ce champ devrait donc être vide si le formulaire est validé par un bot. A ce moment là, on envoie vers le message d’erreur de notre choix

Cette solution est pour le moment nickel, puisque je n’ai plus eu aucun spam depuis sa mise en place. A choisir entre la version CSS ou la version JS, je ne saurais laquelle conseiller ou préférer : les deux sont faciles à mettre en place et fonctionnent visiblement très bien. Néanmoins, la version CSS a cessé de fonctionner à 100% du jour au lendemain, ce que je n’ai pas cherché à comprendre… D’un autre côté, si le Javascript est désactivé, le formulaire se valide mais ne remplit pas le champ caché, renvoyant ainsi mon internaute vers une page d’erreur !

Voila pour une solution antispam qui fonctionne (du moins pour le moment). En tout cas, ni captcha ni spam, ça me convient. La solution mise en place ne nuit pas, je pense, à une accessibilité du formulaire de commentaire (sauf cette histoire de Javascript désactivé). Peut-être un jour les spams détecteront ce genre de bidouilles, interprétant CSS et Javascript aisément ou détectant que la page de retour n’est pas celle de provenance ? Qui sait…



Ecrire un commentaire

Remplissez les champs suivants pour laisser votre avis sur ce billet. Quelques balises HTML sont autorisées.

Commentaires

Il y a une erreur dans ton code, il faut mettre

$comment_bots != ‘jeNeSuisPasUnBot’

A ce jour mon antispam qui fonctionne mais qui ne fonctionne pas a quand même bloqué 27 136 envois, et n’a rien laissé passé en dehors bien sûr de quelques commentaires dénués de sens et 2 ou 3 spams “manuels” (normal).
Mais bon, c’est connu et reconnu, cette solution n’est que temporaire, les spam bots se développent aussi et sauront bientôt interpréter CSS et JS…

@ Julien P. => Erreur corrigée. J’ai même rectifié la condition en vérifiant non pas une valeur précise mais juste si le champ est rempli, ou pas.

@ Julien T. => J’avais aussi des spams “manuels”, on peut pas rêver non plus :-)
De ton côté, tu n’as jamais eu de problèmes avec ta solution full CSS ? Comment expliquer qu’elle ait cessé de fonctionner chez moi, du jour au lendemain ?

Bonjour,

Si je comprends bien ton code, il est impossible d’envoyer le formulaire avec “enter”. Si c’est le cas, cette solution n’est pas très accessible.

Edit: Apparement cela fonctionne avec enter. Faudra que je relise le code plus tard… :-/

@

Ca fonctionne toujours avec Enter car le bouton garde son “type=submit”.
Le fait de rajouter “this.form.submit();” n’est qu’une surcouche et n’empêche pas la validation.

@ Pierre Le Bot

Ok mais comment le post est-il accepté puisque le code this.form.yippie-kay.value=’jeNeSuisPasUnBot’ n’est pas exécuté (l’event onclick n’a pas lieu) ?
D’autre part, pourquoi ajouter dans le onclick, this.form.submit(); ? Le form ne sera-t-il pas soumis simplement à cause du click ?

Merci pour tes explications

Le post est accepté tout de même car par l’évènement “onclick” on entend “enclencher le bouton”, que ce soit via la souris (click) ou le clavier (touche entrée).

Je vais de toute façon optimiser ça en plaçant un “onsubmit” dans la balise FORM directement, plutôt qu’au clic sur le bouton de soumission.

Concernant le this.form.submit(); j’avoue (avec honte) ne pas avoir cherché. Je viens d’ailleurs de l’enlever du code, et ça fonctionne très bien sans !

Ben moi sous wordpress j’ai Akismet qui roske, pas un seul spam depuis décembre n’est passé donc les solutions comme ça, pas besoin pour l’instant.

Le seul inconvéniant est à la limite un besoin d’entrainer le filtre, mais bon, il est déjà bien chaud quand tu l’installes…

C’est avec cette solution la que tu recevais “des quantités hallucinantes de spamm” ?

Au départ je n’avais rien (pas même Akismet), puis au vu du nombre de spam, j’ai mis la solution CSS, puis JS.

Donc je résume, t’as pas d’antispam et tu te plains du spam ? :D

Akismet ! L’essayer c’est l’adopter (je nierai avoir sorti une phrase aussi pourrie).

Il y a un énorme problème avec la version en JS… c’est qu’elle n’est absolument pas accessible, et ne doit surtout pas être utilisé. Il faut toujours qu’un système soit viable et utilisable avec le Javascript désactivé.

Ce n’est encore une fois en aucun cas une solution sur le long terme puisque la solution du “captcha” est directement dans ton code …

Il faut essayer d’imaginer que sur d’autres sites les spammeurs s’intéresseront directement à TON code et essaieront de passer outre.