Informations et liens
- Autres billets
- Peut-on améliorer les services Google ?
- Courrier des lecteurs
Un antispam qui fonctionne (vraiment) ?
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…



Il y a une erreur dans ton code, il faut mettre
$comment_bots != ‘jeNeSuisPasUnBot’