Ça suffit !

Certains blogs (comme Embruns.net) hésitent à fermer leurs commentaires de façon définitive suite à des attaques massives de spammeurs. Des acharnés pensent déjà à coupler Spamplemousse et SpamClear pour une protextion optimale de leur blog. A ce train là, on passera bientôt plus de temps à gérer les spams qu'à rédiger des billets. On va même jusqu'à songer à changer l'architecture du formulaire pour tromper les vilains. Nom de Zeus ! Ça suffit ! Voici venir une (vraie) solution.

A la source

Pourquoi faire simple quand on peut faire compliqué ? Vaut-il mieux mettre des pièges à renards autour de son poulallier pour éviter à ces derniers d'entrer ou alors surveiller ce poulallier et gueuler par la fenêtre à chaque renard qui passe (ne regardez pas) ? Prendre le problème à la source, voilà donc qui est intéressant. Les robots spammeurs sont avant tout des robots et, par définition, un robot n'est pas humain. Super. Oui, parce que grâce à cette différence, on va pouvoir traquer le renard. On va détecter à l'envoi du formulaire si oui ou non il a bien été envoyé par la main de l'homme. Cette technique va nous permettre de filtrer efficacement les spams des commentaires légitimes.

Comment ça marche ?

Quand on valide un formulaire, la valeur du libellé de tous les champs nommés est envoyée au serveur. Pour les boutons submit, il y une petite subtilité : seul la valeur du bouton cliqué est envoyée. L'idée est donc de placer plusieurs boutons submit dans le formulaire, en leur donnant le même nom. On pourra ainsi détecter via la valeur reçue comment le formulaire a été envoyé. On utilise donc un premier bouton auquel on donnera une valeur (un libellé) spamesque humainement compréhensible et on le cachera à la vue des utilisateurs (via CSS). Oui mais l'accessibilité ? Justement, vu qu'on aura donné un libellé évident de non-utilisation, même les gens pour qui il ne sera pas caché cliquerons sur l'autre.

Utilisation

Voilà un exemple pour mieux vous faire comprendre mes mots sans dessus dessous.

geshi html4strict
<input type="submit" value="(ce bouton est un test antispam)" name="submitbtn" disabled="disabled" style="display: none;" />
<input type="submit" class="preview" name="preview" value="prévisualiser" />
<input type="submit" class="submit" value="envoyer" name="submitbtn" />

Evitons les débats sur la méthode de masquage du bouton : utilisez celle qu'il vous plaira.

En pratique

Il ne nous reste qu'à tester la valeur du bouton submit reçue. Si le robot s'est contenté d'envoyer des données à l'adresse du formulaire, le bouton n'aura pas de valeur. Si le robot utilse un script qui remplit les champs du formulaire, la valeur sera celle du premier bouton submit, le bouton factice. Si la valeur reçue est celle du deuxième bouton, on accepte et on passe au traitement habituel des commentaires. Pendant le temps que vous allez gagner à ne pas ajouter frénétiquement des mots à votre liste noire et à apprendre à un script à comprendre ce qui est spam et ce qui ne l'est pas, vous allez pouvoir reprendre un semblant de vie sociale et, qui sait, rencontrer des gens.

Des chiffres

Depuis que j'ai installé ce système sur ce blog (über frimu), sur environ 400 commentaires, 40% sont tombés dans le piège-à-con du bouton factice, 29% sont arrivés avec une valeur vide pour le bouton submit et 11% ont été stoppés net par une deuxième méthode que je détaillerai après. Je crois que c'est clair : ça marche. Les commentaires indésirables, qui représentaient ici 80% des commentaires postés, n'ont même pas été pris en compte. Pas de filtre sur des mots-clés, pas d'analyse bayésienne. Pas de post-traitement tout court. Si ça c'est pas du temps gagné.

Solution non exclusive

Il est cependant évident que cette méthode (bien qu'efficace) n'est pas infaillible, en ce sens que des messages indésirables peuvent toujours arriver s'ils sont envoyés par des humains. C'est pourquoi l'utilisation de l'un ou l'autre plugin peut rester un atout. Mais fini les 23 pages par jour à analyser, 3 messages par semaine tout au plus. Il arrivera certainement un jour où cette technique ne sera plus assez efficace. On trouvera autre chose le moment venu mais en attendant, on profite.

Méthode alternative

En plus du test sur la valeur du submit, je vérifie le mode de connexion du posteur. J'ai en effet constaté que tous (ou presque ?) les commentaires valides arrivaient avec comme header de connexion ($_SERVER['HTTP_CONNECTION']) "Keep-alive" mais surtout que beaucoup de spams eux avaient comme header "Keep-alive, TE, close". J'ai donc ajouté, en plus du test sur le bouton d'envoi, un test sur la valeur de cette variable. Libre à vous de l'utiliser ou non mais pour ma part, je trouve ça très efficace.

Conclusion

Ce billet a pour unique but de présenter une technique antispam efficace pour DotClear. Cette solution fonctionne à merveille ici mais ne vient avec aucune garantie. Il n'y a pas bien grand risque sinon d'être débarassé de centaines de commentaires indésirables. Je n'en ferai pas un plugin dans la mesure où il en existe déjà deux, ce qui est déjà bien suffisant. Libre aux développeurs de ces plugins d'intégrer ou non cette modification pour accroître l'efficacité de leur plugin.