Enfin un bon antispam pour DotClear.
Par Benjamin le mercredi 17 mai 2006, 21h45 - DotClear - Lien permanent - URL miniature
Avant, DotClear c'était bien. Méconnu des merdeux, c'était tranquille. Mais ça attire les foules... et les vilains. D'où une croissance exponentielle de la publicité viagra-esque sur les blogs. C'est la rançon de la gloire. Des bidouilles en tout genre ont donc vu le jour : captcha (code caché dans une image), captcha accessible (réponse à donner à une question), capte-chat (cliquer sur tous les chats), Spamplemousse (plugin utilisant une liste noire de mots-clés), SpamClear (plugin utilsant un filtre bayésien), tout ça pour éviter à des pouilleux de foutre le dawa dans les commentaires. Soigner ? Oui. Mais guérir ?
Ç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.
Commentaires
Technique intéressante, mais je n'aime pas beaucoup la désactivation visuelle du bouton d'envoi, qui sera visible sans prise en charge du css. Cela induit que l'on affichera quelque chose qui n'a pas sa place sur ces pages sans prise en charge du css
...
à quelle fréquence ton blog est-il visité par des gens n'ayant pas un navigateur compatible avec les CSS ? c'est pas une excuse ? oui, peut-être, mais ça évite de passer son temps à faire le ménage...
Je suis d'accord avec toi : ça doit se compter sur les doigts d'une main, surtout sur un site avec pas mal d'images comme le mien (et assez fréquenté).
C'est plus conceptuellement que cela me dérangerait de mettre en place ce type de solutions sur mon site. Je préfère serrer le filtrage de mon spamplemousse et vérifier très régulièrement les messages tombés dedans.
Mais il n'y a pas (encore ?) de solution miracle...
Bad behaviour, peut-être?
http://www.ioerror.us/software/bad-behavior/
Je l'ai jamais essayé, vu que.. bah.
Il a été adapté pour dotclear:
http://www.homelandstupidity.us/software/bad-behavior/installing-and-using-bad-behavior/on-dotclear/
Bon, il me fait un peu peur en lisant ça
http://error.wordpress.com/2005/09/30/what-to-do-when-bad-behavior-blocks-you-or-your-friends/
.. mais si vous voulez l'essayer, je s'rais bien content de savoir ce que ça donne
c'est le problème avec tous les antispams : ils finissent toujours par causer des problèmes ou par bloquer les mauvaises personnes, moi je dis vive les méthodes alternatives.
Grumble, c'est quoi cette manie de ne pas laisser les rétroliens ouverts ?
Bon, tout ça pour dire que je parle de toi, au sujet de l'ordre d'exécution des solutions antispams.
les trackbacks ont toujours été ouverts ici mais dans la mesure où 90% des trackbacks envoyés sont des spams, le jour où il y en a eu plus de 60 d'un coup j'en ai eu un peu marre et je les ai fermés, cela dit les voilà réouverts; quant aux commentaires ils n'ont aucune limite temporelle
cela étant dit, merci d'avoir fait référence à la technique mise au point pour ce blog et qui — rappelons-le — donne de très bons résultats et nous fait gagner un temps précieux de non-tri
Je te conseille l’astuce d’IPcheck que je signale dans mon billet, c’est vraiment impressionnament efficace.
Très bon cette solution, je vais m'empresser de la mettre en place.
Personnellement j'ai déjà opté pour quelques solutions trouvées sur le forum de DotClear, dont un captcha (code à recopier) ainsi qu'une modification de tb.php, où - si je ne me trompe pas - est vérifié si le site qui fait le trackback possède une URL en retour.
Encore merci et bravo pour ce super blog.
Joffrey
Ca m'a l'air terrible comme solution et je te crois pour son efficacité sur parole, mais quand on ne programme pas on le fait comment ca ? --> "Il ne nous reste qu'à tester la valeur du bouton submit reçue." Facile à dire, mais pour moi, pas facile à faire ! Penses tu pouvoir en dire un peu plus dans ce billet ? enfin avant que je me suicide pour dépression nerveuse due au spams ?
perso j'utilise www.SpamEnMoins.com pour ne plus avoir aucun Spam (j'en avais 100 à 200 par jour !!)
voilà un exemple de code cil :
<?php if ($_POST['submitbtn'] == "envoyer") { // 2e bouton utilisé } ?>
Aussi bon que akismet pour wordpress?
complémentaire dirais-je