Anti-spam sur les formulaires 6
Ce soir je suis tombé sur cet article qui décrit une méthode particulièrement astucieuse pour éviter de se faire spammer sur les formulaires.
Alors bien sûr, il existe la fameuse captcha, mais je ne la trouve pas satisfaisante. Parfois, les séquences sont quasi-illisibles et cela rajoute de la complexité dans la saisie des formulaires. En ces temps où l’on cherche à simplifier et améliorer l’expérience utilisateur, nous devons penser à d’autres systèmes.
L’auteur nous explique sa méthode en se basant sur l’analyse suivante :
- les robots remplissent tous les champs de formulaire
==> l’ajout d’un champs masqué en css dans le formulaire permet de vérifier si le formulaire a été rempli par un être humain. Dans le code de soumission du formulaire, en vérifiant la présence de cette variable dans le POST, on peut vérifier la provenance.
- les robots remplissent les formulaires à une vitesse non humaine
==> en vérifiant le temps qui s’est écoulé entre l’affichage du formulaire et sa soumission, il est possible de vérifier si il a été rempli par un être humain.
Vous pourrez trouver la librairie PHP écrite par le bloggueur. Elle est particulièrement bien écrite.
Est-ce une bonne solution ? Comment un robot pourrait la contourner ? Vos avis ?
Pour avoir tester les deux solutions ni l’une ni l’autre n’es probante.
Dans le premier cas, certains robots ne remplissent pas les champs masqués et certains formulaire sont alimentés par des personnes réelles.
Dans la seconde solution un formulaire peut être postés à la vitesse grand V par des humains. Avec un plugins dans le navigateur qui prérempli les formulaires (notemment les formulaire d’indentification). En actualisant une page avec un formulaires déjà posté. Par le boutons précédants.
Le champ caché reste une très bonne solutions vincé la pluspart des bots pour l’instant néanoins.
@Seza
Isolée c’est vrai, combinée ça commence à devenir très intéressant. J’aimerai juste souligner que l’objet ne se limite pas au champ caché et au timeout. D’après mes stats sur une journée au hasard, sur 1459 spams, 908 sont bloqués avant de passer sur ces tests. 434 sont bloqués par le champ caché, et seulement 10 par le timeout.
Je veux juste souligner que les tests ne sont pas cumulatifs. Dès qu’un spam est détecté, il passe à la “trappe” sans que les autres tests soient exécutés. Les tests sont également paramétrables / désactivables. Même en positionnant le timeout à 1 seconde, nombre de robots seraient piégés si je me fie à mes stats.
L’objet n’a pas été écrit pour des formulaires d’identification, et si vous souhaitez l’implémenter dans ce cadre d’utilisation, alors oui, vous avez raison, il faut faire sauter le test sur le timeout.
Ce ne devrait jamais être un problème si le code derrière le blog est correctement pensé. Toute validation de données doit être géré sur un script à part qui enregistre puis redirige le client afin de prévenir ce type de problème.
Enfin, je remets juste une note que j’avais écris à l’époque à propos du timeout :
“Ce laps de temps peut être évalué avec une faible marge d’erreur à dix secondes maximum, au vu du nombre de champs à remplir (pseudo, titre, adresse mail, commentaire, que sais-je encore).
En deçà de ces dix secondes, soit le formulaire a été rempli par un robot, soit le commentaire en question ne mérite vraisemblablement pas de s’y attarder.”
Tout en sachant que la valeur du timeout initiale est reprise de l’analyse de la variable serveur $_REQUEST, la plus proche de la réalité donc.
Evidemment, je prêche pour ma paroisse…
pour ma part, j’utilise juste un bout de code javascript qui corrige la destination du formulaire sur le submit.
http://www.jpfox.fr/?post/2008/06/22/218-protection-de-formulaire-contre-le-spam
Et ça marche plutôt bien.
Le javascript est la seule chose qui peut permettre de contrer ça. Seulement une technique ne fonctionne que si elle n’est pas connue.
Et si eux sont fûtés, ils vont détecter les sites où leurs outils ne fonctionnent pas et trouver site après site toutes les combines…
C’est une guerre ;)
test
тест1
тест2
текст на Рефале: ы
e.arg : e.head t.term e.tail \? { <Whitespace t.term> \! $fail; t.term e.tail; };;конец текста на Рефале.