Skip to content

5.9.0

Choose a tag to compare

@20syldev 20syldev released this 08 Sep 13:39
· 25 commits to master since this release
5.9.0
f282aa6

Version 5.9.0 - Septembre 2026

  • Ajout de l'endpoint /pow : une preuve de travail en remplacement du captcha — le serveur émet un salt et une difficulté, le client cherche un nonce dont l'empreinte sha256 commence par autant de zéros, puis le renvoie en POST pour vérification. À la difficulté par défaut de 4, la résolution prend moins d'une seconde dans un navigateur et reste imperceptible pour une personne, mais devient ruineuse pour un robot qui la répète des milliers de fois. C'est la seule protection anti-bot qu'un modèle de vision ne sait pas contourner, et la documentation recommande désormais de la préférer au captcha visuel.
  • L'endpoint /captcha gagne un mode challenge : l'image arrive accompagnée d'un jeton signé dans l'en-tête X-Captcha-Token, et la réponse n'est plus livrée en clair. Elle n'existe que dans la signature du jeton — impossible à extraire, même en interceptant la réponse. Un POST /captcha portant token et answer renvoie ensuite { "valid": true }.
  • Le rendu de ce mode challenge est durci contre la lecture automatique : les glyphes se chevauchent pour empêcher leur découpage, suivent une ligne de base sinusoïdale, mélangent plusieurs polices, et sont traversés par des traits de la même couleur que le texte, qu'aucun filtre ne peut donc retirer. Le mode par défaut, lui, ne change pas d'un pixel.
  • Les jetons de captcha et de preuve de travail sont à usage unique et expirent au bout de 5 minutes : un jeton rejoué répond used, un jeton périmé expired, un jeton falsifié ou issu d'une autre instance wrong.
  • La variable CHALLENGE_SECRET signe ces jetons. Tant qu'elle n'est pas définie, chaque processus s'invente sa propre clé : les jetons cessent d'être valides après un redémarrage et sont rejetés par les instances voisines — à définir pour tout déploiement qui fait tourner plus d'un processus.
  • Les en-têtes X-Captcha-Text et X-Captcha-Token sont désormais exposés au JavaScript des navigateurs ; ils restaient jusqu'ici invisibles depuis une page web, faute de déclaration CORS.
  • Les journaux distinguent maintenant les niveaux de gravité : une erreur serveur est enregistrée en error, un refus client en warn, et le reste en info.