Tout d'abord, les champs aux noms variables.
Pour qu'un robot remplisse correctement un formulaire, il va rechercher le textarea à l'identifiant text, le champ à l'id name et à l'id url. Si ces noms génériques sont abandonnés, au profit de chaînes aléatoires telles que jd1gehj5k4f, et qu'elles sont recalculées à chaque chargement de la page de commentaires, alors vous avez déjà un obstacle de taille au spam. Évidemment, c'est moins pratique pour le visiteur (dont le navigateur ne peut retenir les valeurs des champs pour la prochaine visite), il faut donc absolument ajouter une case "se souvenir de moi" à ce système.
Rajoutez maintenant un input id="url", remplissez le (avec value) par "Merci de laisser ce champ vide", et cachez le ensuite en CSS avec un display=none (ainsi, même avec un navigateur texte, l'humain saura qu'il ne doit pas y toucher). Un robot ne le différenciera pas d'un champ classique, et le remplira (en se basant notamment sur son identifiant). Si le champ est vide ou inchangé, alors on a à faire à un visiteur réel, sinon, c'est un méchant spammeur. Il faut aussi faire attention aux robots qui remplissent les champs qu'ils ne connaissent pas avec "None". Si vous détectez cette valeur, facile de classer le commentaire comme indésirable, aucun humain ne l'utilisera.
On peut aussi calculer le ratio texte/url. C'est simple, un visiteur normal voulant donner une URL l'accompagnera au moins d'un texte d'une taille moyenne. Et si il veut en donner 5, on suppose que son message sera proportionellement 5 fois plus long. On peut partir sur 20 lettres par URL. Pour donner 5 adresses, il faudra 100 lettres (ceux de l'URL bien évidemment non compris), ce qui me semble assez raisonnable. Un simple calcul, donc (après avoir déterminé le nombre d'adresses et le nombre de lettres hors-URL) : nombrecaractères/nombreURL. Attention, on parle bien de lettres et pas de caractères. Espaces et ponctuation ne doivent pas être compris dans le calcul. Si le résultat est inférieur à 20, on peut penser que le commentaire est un spam. Ça ne peut être entièrement fiable, et ça ne peut rien faire contre les spams "doux" du style "Hi. Very good site. Mine is http://spam.com/" (sauf si ils sont trop doux, du genre "Hi. Very good site. http://spam.com/" !). Par contre, les listes d'adresses seront impitoyablement arrêtées. Ça laissera passer une grande majorité de commentaires réels, rien que "Je suis d'accord avec toi, cf mon billet : http://url.fr/", puisque le ratio sera de 31/1, soit... 31. Dans le même temps, ça ne bloque pas les longs commentaires argumentés et illustrés par pas mal de liens, comme le ferait une simple limitation du nombre d'adresses.
Voici déjà 3 pistes qui donneront du fil à retordre aux robots spammeurs, sans importuner le visiteur avec un captcha parfois pas à la portée de tout le monde (j'ai déjà vu "Quelle est la capitale de la Belgique ?"... ce n'est pas difficile, mais imposer de connaître Bruxelles pour pouvoir commenter un billet me semble un brin déplacé).


