Skip to content

feat(formulaire): preuve de travail et refus des adresses jetables - #17

Merged
PhilippeVienne merged 2 commits into
mainfrom
feat/anti-robots
Sep 27, 2026
Merged

PhilippeVienne merged 2 commits into
mainfrom
feat/anti-robots

Conversation

@PhilippeVienne

Copy link
Copy Markdown
Contributor

Anti-robots sans service tiers, en plus des protections existantes (champ piège, délai minimal, limite par IP, plafond global, contrôle d'origine, double consentement, modération).

  • Preuve de travail : dès l'affichage, assets/pow.js (WebCrypto) cherche un entier tel que SHA-256(jeton:entier) commence par 18 bits nuls (pow_bits, réglable) ; le serveur le vérifie (pow_ok()). Mesuré dans Chrome : ≈ 0,8 s sur ordinateur, calculé pendant la saisie ; l'envoi attend le calcul s'il n'est pas fini. Coûteux pour un robot qui envoie en masse, qui doit en outre exécuter le calcul.
  • Jeton à usage unique : le jeton de formulaire gagne un aléa et ne sert qu'une fois (form_tokens), pour qu'une preuve ne soit pas rejouée.
  • Adresses jetables refusées (src/disposable-domains.txt, ~55 domaines tenus à la main, sous-domaines compris), avec un message qui explique pourquoi (lien de retrait).
  • JavaScript devient nécessaire pour signer : un <noscript> renvoie vers contact@otspi.org.

⚠️ Base : feat/admin-passkey (#14), pour réutiliser le chargement d'un script du site dans page() ; à fusionner après #14 (GitHub reciblera sur main). Au déploiement, un formulaire ouvert avant la mise en ligne (ancien format de jeton) sera refusé une fois : la personne recharge la page.

Vérifié : bash tests/flow.sh (preuve absente, fausse, rejouée ; adresse jetable ; contrôle exact des bits) ; dans Chrome, envoi réel du formulaire avec la preuve calculée par le navigateur, acceptée par le serveur.

Anti-robots sans service tiers :
- preuve de travail : le navigateur (assets/pow.js, WebCrypto) cherche
  pendant la saisie un entier tel que SHA-256(jeton:entier) commence par
  18 bits nuls (réglable : pow_bits), vérifié par pow_ok() ;
- jeton de formulaire avec aléa et à usage unique (table form_tokens) :
  une preuve calculée ne sert qu'une fois ;
- adresses d'e-mail jetables refusées (src/disposable-domains.txt,
  sous-domaines compris) : la signature doit rester joignable pour
  recevoir son lien de retrait.

JavaScript devient nécessaire pour signer ; sans lui, un message
renvoie vers contact@otspi.org.

Co-authored-by: Claude <noreply@anthropic.com>
@PhilippeVienne
PhilippeVienne changed the base branch from feat/admin-passkey to main September 27, 2026 07:29
Co-authored-by: Claude <noreply@anthropic.com>
@PhilippeVienne
PhilippeVienne merged commit ed9ce2b into main Sep 27, 2026
3 checks passed
@PhilippeVienne
PhilippeVienne deleted the feat/anti-robots branch September 27, 2026 07:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant