Retour au blog
Notions de base Publié le 19.08.2026 7 min de lecture

Ce qui protège réellement un formulaire : CAPTCHA, honeypot, piège temporel, CSRF

La plupart des formulaires de contact s’appuient sur une seule astuce contre le spam, et beaucoup de ces astuces n’arrêtent que les robots les plus simples. Ce que chaque couche de protection arrête, ce qu’elle coûte et quelle combinaison est pertinente.

Le spam via les formulaires de contact provient rarement d’une personne qui tape à la main. Il s’agit le plus souvent de logiciels qui trouvent des formulaires, remplissent tous les champs et envoient le résultat – des milliers de fois. Il existe plusieurs défenses, et elles agissent à des endroits très différents. Savoir ce que chacune fait réellement aide à éviter deux erreurs : un formulaire sans véritable protection, et un formulaire si lourdement gardé que les vraies personnes abandonnent.

Comparaison des couches de protection
Couche et ce qu’elle arrête
  • Honeypot : les robots simples qui remplissent tous les champs
  • Piège temporel : les scripts qui envoient immédiatement après le chargement
  • CAPTCHA : la plupart des automatisations génériques
  • Jeton CSRF : les requêtes envoyées directement au point de terminaison
  • Limitation du débit : les déferlements depuis une source unique
  • Preuve de travail : les envois massifs bon marché, sans pistage ni énigme
  • Contrôles côté serveur : tout ce qui contourne le navigateur
Ce qu’elle laisse passer ou ce qu’elle coûte
  • Les robots ciblés l’ignorent ; s’il est mal masqué, les lecteurs d’écran l’annoncent
  • Les robots qui attendent ; sans signature côté serveur, il est facile à falsifier
  • Un obstacle pour tous, des barrières d’accessibilité, souvent un tiers impliqué ; des services de résolution existent
  • Les robots qui chargent d’abord la page obtiennent eux aussi un jeton valide
  • Le spam réparti sur de nombreuses adresses IP
  • Un expéditeur déterminé disposant de puissance de calcul ; nécessite JavaScript
  • Rien à eux seuls – mais sans eux, toutes les autres couches ne sont que décoration
Aucune couche ne couvre tout à elle seule. Les couches invisibles et peu coûteuses filtrent l’essentiel ; les plus lourdes sont réservées au spam persistant et ciblé.

Honeypot et piège temporel : des filtres invisibles

Un honeypot est un champ supplémentaire que les personnes ne voient jamais, par exemple un champ nommé « website » masqué en CSS. Les robots simples remplissent tous les champs ; un honeypot rempli signale donc une automatisation, et le serveur peut écarter discrètement le message. Les robots écrits spécifiquement pour votre site, ou ceux qui affichent la page comme un navigateur, l’ignorent. Masquez-le correctement : un champ simplement déplacé hors de l’écran peut être annoncé par les lecteurs d’écran, atteint avec la touche Tab ou rempli par la saisie automatique. Utilisez aria-hidden, tabindex -1 et autocomplete off, ainsi qu’un libellé neutre demandant à quiconque y arrive de le laisser vide.

Un piège temporel enregistre le moment où le formulaire a été servi et rejette les envois qui arrivent de manière invraisemblablement rapide. Les personnes ont besoin de quelques secondes pour lire et taper ; de nombreux scripts envoient en une fraction de seconde. L’horodatage doit être vérifié sur le serveur et protégé contre la manipulation, par exemple signé ou conservé dans la session – un simple champ horaire masqué est tout bonnement réécrit par le robot. Gardez un seuil bas, car la saisie automatique rend aussi les vraies personnes rapides. Les robots qui se contentent d’attendre passent : un piège temporel est un filtre, pas un mur.

CAPTCHA : efficace, mais pas gratuit

Un CAPTCHA demande la preuve qu’aucun robot n’est à l’œuvre – des énigmes en images aux contrôles qui s’exécutent en arrière-plan ; parmi les services courants figurent reCAPTCHA, hCaptcha, Cloudflare Turnstile et Friendly Captcha. Il arrête la plupart des automatisations génériques, ce qui explique sa popularité. Mais chaque énigme visible est un obstacle devant lequel certains visiteurs abandonnent, et la plupart des services chargent un script tiers, ce qui soulève des questions de confidentialité et de consentement. Un CAPTCHA n’aide par ailleurs que s’il est correctement configuré : une clé de site de test publique, un widget sans son script ou un jeton que le serveur ne vérifie jamais ressemblent à une protection, mais n’en sont pas. Une vérification gratuite sur formexposed.com signale ce type d’erreurs depuis l’extérieur.

L’accessibilité fait partie de ce coût. Les énigmes en images excluent les personnes aveugles et de nombreuses personnes malvoyantes, les alternatives audio n’aident pas les personnes sourdaveugles, et les tâches logiques complexes pèsent sur les personnes ayant des troubles cognitifs. Le critère de succès 1.1.1 des WCAG 2.2 exige une alternative textuelle décrivant la finalité du CAPTCHA ainsi que des formes alternatives pour différents sens. Les contrôles en arrière-plan évitent la plupart de ces problèmes, mais lorsqu’ils deviennent méfiants, la solution de repli est souvent à nouveau une énigme visuelle – testez ce parcours au clavier et avec un lecteur d’écran.

Jeton CSRF : une protection contre la falsification, pas contre le spam

Un jeton CSRF est une valeur aléatoire que le serveur insère dans le formulaire et attend en retour. Il a été conçu contre la falsification de requêtes intersites (cross-site request forgery), où un autre site web fait envoyer par le navigateur d’un visiteur une requête que celui-ci n’a jamais voulue. Sur un formulaire de contact public, il a un effet secondaire : les robots qui envoient directement à l’adresse du formulaire sans charger la page sont rejetés. Tout robot qui récupère la page et renvoie le jeton passe. La plupart des frameworks et plugins de formulaire intègrent de toute façon des jetons CSRF – gardez-les activés, mais ne les comptez pas comme une protection anti-spam.

Ce qui doit se passer sur le serveur

Les contrôles uniquement côté navigateur ne protègent rien
Tout ce qui s’exécute uniquement dans le navigateur – validation JavaScript, script vérifiant le honeypot, jeton CAPTCHA que personne ne vérifie – est contourné dès que quelqu’un envoie la requête directement. Toute décision d’accepter un message relève du serveur.
  • Validez à nouveau chaque champ sur le serveur : champs obligatoires, longueur, format de l’e-mail et absence de sauts de ligne dans les champs qui se retrouvent dans les en-têtes des e-mails.
  • Vérifiez les jetons CAPTCHA et de preuve de travail à chaque envoi, auprès du service émetteur ou dans votre propre code, et rejetez les jetons réutilisés.
  • Limitez le nombre d’envois par adresse IP et par fenêtre de temps. Cela arrête les déferlements depuis une source unique ; le spam réparti sur de nombreuses adresses nécessite d’autres couches.
  • Envisagez la preuve de travail : avant l’envoi, le navigateur résout une petite tâche de calcul. Les visiteurs ne voient aucune énigme et rien n’est pisté, mais l’envoi massif devient coûteux.

Une combinaison judicieuse : deux ou trois couches

  1. 1Commencez par les couches invisibles : un honeypot accessible et un piège temporel signé, tous deux vérifiés sur le serveur.
  2. 2Ajoutez une limitation du débit par adresse IP afin qu’une source unique ne puisse pas inonder le formulaire.
  3. 3Si du spam ciblé passe encore, ajoutez une preuve de travail ou un CAPTCHA – de préférence sans énigme visible et avec une alternative accessible.
  4. 4Conservez le jeton CSRF fourni par votre framework – comme bonus, pas comme défense.
  5. 5Testez le résultat en tant que visiteur – uniquement au clavier, avec un lecteur d’écran, sur un téléphone – et vérifiez que les vrais messages arrivent toujours.

Sur de nombreux sites, honeypot, piège temporel et limitation du débit éliminent déjà ensemble la majeure partie du spam générique, sans aucun obstacle visible ; un CAPTCHA est la réserve pour les cas où cela ne suffit pas. Sous WordPress, le plugin gratuit formexposed combine honeypot, contrôle de durée et preuve de travail sans recourir à Google. Pour voir ce que votre formulaire montre de l’extérieur – quelles couches sont présentes, si un CAPTCHA est configuré efficacement –, une vérification gratuite sur formexposed.com ne nécessite qu’un domaine, sans compte. Elle ne peut pas voir le code de votre serveur ; la partie côté serveur reste donc de votre ressort.