Captcha

D'après Wikipédia :

Un Captcha est une forme de test de Turing permettant de différencier de manière automatisée un utilisateur humain d'un ordinateur.

Captcha Et vous avez probablement déjà rencontré ce genre de test. Il se caractérise très souvent par une image sur laquelle on fait apparaître une série de caractères qui seront à recopier dans un champ pour pouvoir valider le formulaire. L'objectif étant de rendre impossible la lecture de ces caractères par un programme (bot) mais faisable pour un humain. On trouve également des test qui proposent, en plus de l'image, un son dans lequel on entendra les caractères à écrire.

Mais ce genre de test pose des problèmes d'accessibilité, pensons au mal voyants qui pourront avoir des difficultés à résoudre ce genre d'énigme. Ou encore au utilisateurs de navigateurs qui n'affichent pas les images, etc. Par ailleurs, ce genre de test peut être décourageant. C'est une saisie de plus à effectuer pour le visiteur.

On notera tout de même que cette solution est souvent suffisante pour lutter contre le spam, à condition que le captcha employé soit suffisamment efficace. Mais il faut rester prudent, et ne pas tomber dans l'excès inverse, car certains captcha deviennent vite indéchiffrables.

L'anti captcha

Anti-captcha

Une idée intéressante, c'est l'anti-captcha. Le principe est simple : faire croire aux bots qu'il y a un captcha, donc une image à déchiffrer. En vérité, le seul moyen de valider le formulaire est d'écrire tout autre chaîne de caractères que celle qui est affichée. Un bot pourra donc faire autant d'OCR que possible, ça ne donnera rien.

Idée séduisante à première vue! Mais il y a un risque non négligeable. Tout le monde, internautes réguliers, s'est habitué aux captcha. En voyant pareil image, le réflexe sera naturellement de recopier le texte à l'identique et le formulaire ne sera pas validé. Ne faites pas l'innocent, vous et moi le savons bien, nous ne lisons jamais les instructions quand les choses nous paraissent évidentes.

Encore du captcha

On trouve également des tests de logique, par exemple combien font 10+10 ?, si vous répondez 20, le formulaire est validé. Ou d'autres test qui nous demande de sélectionner, parmi une liste d'images, celle qui représente tel objet, ou tel animal. Ceci relève toujours du domaine du captcha.

C'est une solution assez efficace pourvu qu'elle soit correctement employée. Les images posent des problèmes d'accessibilité, comme je le disais plus haut, et impossible d'utiliser un texte alternatif dans ce cas (autant donner directement la réponse). Elles sont donc à éviter, mais des questions de calcule, simple mais aléatoires peuvent convenir.

Vérifier que l'envoi du formulaire résulte bien du passage par ce formulaire

Certains bots repèrent les champs à remplir sur votre formulaire et envoient les données à la page de traitement en fonction. Ils pourront ainsi envoyer plusieurs fois ces données sans passer par votre formulaire. Pour bloquer ce genre de pratiques, il suffit de vérifier que les données envoyées résultent bien d'un passage par le formulaire concerné.

Pour cela, il suffit de générer un code qui sera placé dans un champ de type hidden. A la réception des données du formulaire, on vérifie si ce code correspond bien à celui que nous avons envoyé plus tôt. L'important étant que ce code change après chaque validation du formulaire.

Les nom de champ qui changent

Cette technique ne diffère pas beaucoup de la précédente. L'objectif reste le même : vérifier que les données envoyées à la page de traitement proviennent bien d'un formulaire. Ici on utilisera en fait des noms champs qui changent à chaque fois que le formulaire est appelé. Ainsi les renvois automatiques de données sans passer par le formulaire ne fonctionneront plus.

Le champ caché

Un champ classique, de type text, mais invisible pour l'utilisateur. Les bots ne fond pas le rendu de la page qu'ils visitent et s'en tiennent au code html de celle-ci. En principe, ils ne détecteront donc pas que notre champ n'est pas visible et le remplirons. Si ce champ est rempli, le formulaire ne peut pas être validé.

Un exemple, en html :

<p style="display:none">
Ne rien mettre : <input type="text" name="lefauxchamp" />
</p>

Mais certains navigateurs ne tiennent pas compte du CSS et afficheront donc ce champ.

Conclusion

Je vous ai proposé ici quelques solutions techniques visant à bloquer le spam de la part des bots. L'implémentation de ces solutions n'est absolument pas compliquée (une recherche vous donnera certainement de bon tutos) mais il faut rester prudent lorsque l'on s'attaque à ce genre de problème. A trop vouloir protéger un formulaire, on prend le risque de bloquer de véritable utilisateurs.

En plus de ces solution, une analyse de contenu (mot clé connu dans les message de spam) et des informations à notre disposition (ip source connut pour spammer) sont aussi des éléments à prendre en compte dans la détection de spam.