Protection de formulaire contre le spam
Par jp.fox le dimanche 22 juin 2008, 17:04
PHP
::
Lien permanent
Parfois, on cherche des solutions très compliquées pour résoudre certains problèmes.
J'ai mis en place, il y a quelques temps, un système pour protéger un formulaire contre le spam. N'ayant pas accès au code traitant le formulaire, mais uniquement au formulaire lui même, j'ai dû trouver une astuce autre que l'utilisation de captcha. C'est habituellement ce que je mets en oeuvre pour lutter contre ce fléau.
Si on réfléchit un peu à la méthode employée par les bots spammeur, on imagine que ceux ci scrutent le code html de la page à la recherche d'un formulaire, récupèrent le nom des champs et l'adresse de validation du formulaire afin de générer automatiquement une commande POST sur cette dernière.
Une idée est de ne pas fournir une adresse de validation du formulaire correcte afin de tromper le bot. C'est cette idée que j'ai mise en oeuvre.
On place une adresse de validation bidon dans le tag <FORM> et on la corrige par javascript juste avant la soumission du formulaire.
Voici un exemple de code :
<script type="text/javascript"> <!-- function correcturl() { var formobj = document.getElementById("formid"); if(formobj) formobj.action="/vrai/adresse/de/validation/du/formulaire.php"; return true; } //--> </script> <form action="http://www.adresse.bidon.com/pour/tromper/le/bot/" method="post" id="formid" onsubmit="return correcturl();"> Nom : <input name="nom" /> </br/> Prénom : <input name="prenom" /> </br/> <textarea name="commentaire" cols="35" rows="7"></textarea> </br/> <input type="submit" /> </form>
Certes, l'utilisation de cette méthode sur un site à fort trafique poussera les spammeurs à développer un bot spécifique au site, mais pour le site d'une petite entreprise ou d'un particulier, cela fonctionne très bien.




Accessoirement, ca interdit ce formulaire à tous ceux qui ont un navigateur sans javascript...
Une idée à laquelle j'ai pensé et qui est pourtant très simple. On a fort à parier que les bots ne savent pas interprété le CSS et qu'ils remplissent tous les champs qu'ils rencontrent. Mon idée serait de créer un champ masqué en CSS. A la validation, on vérifie que le champ a été rempli ou non. S'il est rempli, on suppose que c'est un bot sinon c'est certainement un être humain.
On peut en plus ajouter un tocken pour donner une durée de vie au formulaire. En fonction de la longueur du formulaire, on peut être capable d'évaluer le temps minimum nécessaire à un être humain pour le remplir. Ainsi on peut déterminer un temps de X secondes, voire X minutes. En revanche, un bot remplira très certainement le formulaire instantanément. Si l'on met en session le timestamp au moment où le bot arrive sur le formulaire et qu'on fait la différence avec le timestamp au moment de la validation du formulaire, on aura très certainement une valeur très faible dans le cas d'un bot (de quelques microsecondes à 1 ou 2 secondes tout au plus). Avec un être humain, on s'attendrait au minimum à plusieurs dizaine de secondes. Là encore ça peut nous permettre de jeter le bot.
++
@Guy : le pauvre utilisateur qui n'a pas javascript doit avoir une drôle de vision du web et doit rencontrer d'autres problèmes. Mais c'est vrai, ce système interdit les navigateurs sans javascript. Par contre, côté accessibilité, c'est mieux qu'un captcha.

@Hugo : il existe en effet tout un tas de solution
jp.fox, tu parle d'accessibilité, justement l'utilisation du javascript ici rend ton formulaire totalement inaccessible aux gens qui sont forcé d'utiliser des navigateurs n'utilisant pas le javascript...
@Gameplayer : je n'en suis pas si sûr, accessibilité et javascript ne sont pas forcément incompatibles : forum.alsacreations.com/t...

Mais j'avoue ne pas être un spécialiste de ce domaine, malheureusement.
Un test avec Lynx montre, en effet, que cela ne fonctionne pas
Je pense que l'idée d'Hugo est intéressante, même très intéressante, sauf que l'on pourrait plus simplement ne pas cacher ce champ et mettre : "Ne pas remplir ce champ" en label.
Je cherchais justement une manière efficace de protection sans passer par du captcha ou autre, je crois la tenir du coup =D Merci !
Hello,
@hugo et K
J'utilie cette méthode sur mon site depuis plusieurs mois, elle s'avère efficace, mais pas imparrable.
J'ai identifié 2 bots distincts qui la contournent.
Et qui m'ont ensuite laissé quelques milliers de commentaires / jours.
J'ai donc adjoint à cette pratique une petite expression régulière sur les champs du formulaires qui me permet de bloquer certains paterns. Comme ces deux bots utilisaient toujours la même structure d'adresse email, je bloque 100% des spams.
En gros si je me souviens bien de ce que j'ai appris sur l'accessibilité, et ce qui semble être confirmé par cet article, le javascript et l'accessibilité ne sont pas incompatibles. Par contre, il ne faut pas que l'absence de javascript bloque la navigation, comme c'est le cas ici. Si javascript est désactivé, ton formulaire ne fonctionne plus, ce qui au final bloque au niveau de l'accessibilité (CF : openweb.eu.org/articles/f... au paragraphe accessibilité - Automatismes)
Coquille dans mon précédent commentaire, il faut remplacer "cet article" par "ton lien (dans le commentaire 5 blog.mobilisoft.com/?2008... )"
Retour d'expérience plus d'une semaine après la mise en place de cette technique sur une plateforme de blogs :
- le seul display:none pour le champ "piège" dans une feuille css externe ne suffit pas, certains robots envoyaient malgré tout le champ mais vide.
- y coller en plus une valeur spécifique, en javascript, est pour l'instant efficace à 100% (tous les spams sont bloqués, pas de faux positif).
bonjour je travail actuellement sur mon site j ai mis un formulairepour me contacté sur une adresse hotmail et je recois bien les message , mais il sont considérer comme dangereux la cause "
I (filounancy2@hotmail.fr)
Envoyé : lun. 21/12/09 22:50
À : Webmaster.site-de-filou@hotmail.fr
j ai une info sur Sender ID
quel code dois je mettre sur mon formulaire php pour evité ceci
merci d avance
je suis novice et j apprend pas fcil