Un antispam en CSS : simple et efficace
C’est la hantise de tous les bloggeurs, forumeurs, et autres agents du web, je veux bien sûr parler dur spam !
C’est toujours sacrément frustrant d’installer tout un tas d’antispam différents pour lutter contre ce fléau, et de s’apercevoir qu’ils ne marchent pas, ou pas entièrement.
Et quand on tombe enfin sur un système qui marche, il devient obsolète et est cassé par les bots deux mois après l’avoir installé !
Il y a heureusement des exceptions. Akismet est par exemple très performant, bien qu’il laisse passer quelques billets indésirables. Mais son code a l’inconvénient d’être incompréhensible par le commun des mortels, ce qu’il le rend difficile à améliorer soi-même (j’adore trifouiller les systèmes que j’utilise :jap: )
Partant du principe qu’une simple ruse est souvent la meilleure des défenses, j’ai décidé de vous retranscrire le contenu du billet montrant comment combattre le spam grâce au CSS
On sait que pour parvenir à leurs fins, les bots (ou robots) remplissent tous les champs présents dans un formulaire, histoire d’être certain que ce dernier sera traité. Pour repérer un bot, il nous suffira donc d’ajouter un champ vide par défaut (que l’on appellera ici « info »), puis de le cacher via un attribut CSS.
Si le champ info est vide, alors l’utilisateur n’est pas un robot, si il a été rempli, c’est certainement qu’un vilain bot est venu vous spammer.
Passons maintenant à la réalisation du piège à bot diable:
Tout d’abord, le formulaire :
<form action="mapage.php" method="post"> <label for="pseudo">Pseudo: </label> <input id="pseudo" name="pseudo" type="text" /> <label for="mail">Email: </label> <input id="mail" name="mail" type="text" /> <label for="text">Comment: </label> <input id="text" name="reaction" type="text" /> <input class="input" name="info" type="text" /> <input type="submit" value="Envoyer" /> </form>
Vous noterez l’attribution de la class « input » à notre champ anti-bot. Cela nous permettra de ne cacher que ce champ grâce au seul code CSS qui suit :
.input {
display: none;
}
Cette simple instruction va cacher le champ, mais il restera visible dans la source de la page. Le robot, qui ne voit que la source, tombera dans la panneau et remplira le champ : il sera piégé !
Maintenant, voyons la partie traitement du formulaire :
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
if(empty($_POST['info']))
{
//on continue le traitement du formulaire
}
else
{
//bot signalé
die('A bas les bots !! Mouahahaha !!!!!');
}
}
else
{
die('Non mais tu veux faire quoi sur cette page ?');
}
Et voilà, le tour est joué et vos problème de spam envolés
Simple n’est-ce pas ?
juillet 25th, 2007 à 19:38
Très bonne idée, fallait y penser, bravo ! yipi:
C’est vrai que ça évite de se faire ch*er à créer une image antibot qui ne sert à rien… xD
Mais un simple « » n’aurait-il pas pu suffire ?
Peut-être que les bots ne tiennent justement pas compte des champs marqués du type « hidden ».
Bon courage pour la suite de ton blog, maintenant faudra trouver la même chose, mais pour le mail ! na:
juillet 25th, 2007 à 19:57
un simple quoi ? neutre:
Les champs de type hidden ont -presque- tout le temps une valeur par défaut qui est indispensable au fonctionnement du script. Les bots ne la changent donc pas
Et pour les mails, c’est autre chose :p
Maintenant les spammeurs envoient leur spam dans des fichiers PDF :s
juillet 25th, 2007 à 20:02
Désolé, le HTML a été supprimé lors de l’envoi de message. v_v
Je disais donc un simple
<input type="hidden" name="foo" /> n'aurait-il pas pu suffire ?Et c'est ce que je me suis dit pour les bots et les champs de type "hidden". Merci pour la réponse.
Par contre pour les mails, j'avais encore jamais vu le spam en fichiers .pdf.
De plus, il s'attaquent même pas à Msn (je pense à un virus que j'ai eu en cliquant sur un -soit disant- fichier diapo (je crois) des potes d'un contact en train de faire des choses... que "les grands font" (xD) et qui a pour but de spammer tous ses contacts msn.
novembre 10th, 2008 à 20:36
Salut,
Je voulais juste préciser que cette astuce ne fonctionne que pour les bots automatiques, non ciblés. En effet, n’importe quel hacker pourra passer cette protection s’il veut vraiment attaquer le site. Aucune chance d’utiliser cette astuce sur des gros sites, donc…
A+
novembre 10th, 2008 à 21:13
Tout à fait d’accord =)
Cependant, l’astuce est ici utilisée en complément d’Akismet (ou tout autre système) contre le type de robots qui remplissent à l’aveuglette tous les champs qu’ils trouvent.
C’est donc la plus basique des protections, mais elle convient très bien à la catégorie de blogs à laquelle j’appartiens =p
P.S : j’avais d’ailleurs fait un bot censé spammer les blogs tournant sous WP, et même Akismet s’était avéré inefficace …
novembre 11th, 2008 à 15:39
Désolé de te discriditer, mais il semblerait que cette technique soit vulnérable comme le dit Metalking
!491985fc0774a
novembre 11th, 2008 à 15:46
Par contre, la deuxième protection, Askanet, est efficace : on ne peut poster qu’un message à la fois. A+ et désolé pour le dérangement
.491987a87adc6
novembre 11th, 2008 à 15:53
Roo ! Mais c’est long à entrer hein ! Je suis le premier à reconnaitre que cette *astuce* ne peut s’avérer efficace que contre des bots « stupides » (cad non spécialisés), et qu’il ne faut en aucun cas l’utiliser seule.
J’ai moi aussi codé un bot qui bypassait cette protection sans aucu soucis, et qui bypassait même TOUTES les protections d’Akismet.
Sur ce, j’espère que vous comprendrez enfin mon message :p
P.S : Metalking :: ce commentaire ne t’es en aucun cas destiné
P.S² : cette astuce n’est plus en place sur ce blog depuis la dernière mise à jour de WP … (la flemme d’éditer un fichier =P)
novembre 11th, 2008 à 18:32
Y’a pas de mal :d !
!
C’est juste que je m’ennuyais (et oui, jour férié toussa), que je suis tombé sur ton post sur le sdz
Sinon, je doit reconnaitre que l’astuce est pas mal, même si je l’avais déjà pas mal de fois sur le net.
A+
novembre 11th, 2008 à 18:34
« C’est juste que je m’ennuyais (et oui, jour férié toussa) »
Si ça c’est pas de la geek attitude mdr:
mars 23rd, 2009 à 16:01
Bonjour Kévin, j’ai lu avec attention ce post mais je ne parviens pas à l’intégrer dans la page comments.php ? Peux-tu éclairer ma lanterne ?
mars 23rd, 2009 à 21:47
En voyant ton site, je suppose que tu veux adapter cette astuce à WordPress.
Pour cela, ouvre le fichier wp-comments-post.php (à la racine du blog), et ajoute le code suivant à la ligne 34 :
if(!empty($_POST['info']))
wp_die(__(‘Bouh, fallait pas remplir ce champ.’));
Ensuite il suffit d’insérer le code correspondant au champ caché dans le formulaire de commentaire (dans le fichier comments.php de ton thème, juste avant le bouton submit par exemple)