DevTcha

Bloquez le spam des formulaires sans pister vos visiteurs

DevTcha est une protection anti-robot par preuve de travail qui tourne sur votre propre serveur. Pas de cookie, pas de requête vers un tiers, rien à cliquer ni à déchiffrer : le navigateur fait un petit calcul en arrière-plan, et les robots paient chaque envoi.

Essayer la démo npm install devtcha

Pourquoi DevTcha

Une alternative légère à reCAPTCHA et hCaptcha pour les formulaires de contact, d'inscription et de commentaires.

Sans cookie ni tiers

Défis et vérifications restent entre vos visiteurs et votre serveur. Aucun prestataire externe à déclarer.

Rien à résoudre

Pas d'image, pas de case à cocher. Le calcul démarre à l'affichage du formulaire et se termine en général avant qu'il soit rempli.

Accessible

Un message role="status" annonce chaque état aux lecteurs d'écran. Les textes se traduisent par des attributs.

Quatre langages serveur

Node.js (TypeScript), PHP, Python et Go, tous contrôlés par les mêmes vecteurs de test.

Léger, sans dépendance

Le script navigateur pèse 5,7 Ko minifié. Chaque serveur n'utilise que sa bibliothèque standard.

Jetons à usage unique

Défis signés, date d'expiration, protection contre le rejeu avec une mémoire remplaçable (mémoire, fichiers, Redis, SQL).

Principe

Le serveur délivre un défi signé ; le navigateur retrouve le nombre secret par force brute ; le serveur contrôle la réponse une seule fois.

Le navigateur demande un défi à votre serveur, le résout dans un Web Worker, puis envoie le jeton avec le formulaire ; le serveur le contrôle.

Démo en direct

Le vrai widget <dev-tcha>, dans cette page. Envoyez le formulaire, puis essayez de rejouer le même jeton.

Côté serveur (simulé dans la page)

    Pour fonctionner sans serveur, cette démo crée et vérifie les défis dans la page, avec un secret stocké dans le navigateur. Elle montre le fonctionnement, elle ne protège rien. En production, ces deux étapes restent sur votre serveur.

    Mesuré sur un portable de 2021 (Ryzen 7 5700U, Chromium, difficulté par défaut) : 637 ms par défi en médiane, 1,3 s pour parcourir toute la plage (pire cas). Non mesuré sur téléphone, où c'est probablement plus lent.

    Ce que voient les visiteurs

    Calcul en cours
    Calcul en cours
    Prêt pour l'envoi
    Prêt pour l'envoi
    Envoi avant la fin du calcul
    Envoi avant la fin du calcul
    Défi indisponible
    Défi indisponible

    Intégration

    Deux appels côté serveur et un élément HTML. npm install devtcha

    <script src="/devtcha.js" defer></script>
    
    <form method="post" action="/contact">
      <textarea name="message" required></textarea>
      <dev-tcha challengeurl="/api/devtcha"></dev-tcha>
      <button type="submit">Send</button>
    </form>

    Sans outil de construction, servez dist/devtcha.js depuis votre propre domaine. Avec Vite, webpack ou Next.js : import "devtcha/client".

    import { createChallenge, verifySolution } from 'devtcha/server';
    
    const secret = process.env.DEVTCHA_SECRET; // 32+ random characters
    
    // GET /api/devtcha (Cache-Control: no-store)
    res.json(createChallenge({ secret }));
    
    // POST /contact
    const result = await verifySolution(req.body.devtcha, { secret });
    if (result !== 'ok') return res.status(400).end(); // invalid, expired, reused
    require 'devtcha.php';
    
    // GET /api/devtcha
    header('Content-Type: application/json');
    header('Cache-Control: no-store');
    echo json_encode(devtcha_create_challenge($secret));
    
    // POST /contact
    $result = devtcha_verify($_POST['devtcha'] ?? null, $secret);
    if ($result !== 'ok') { http_response_code(400); exit; }

    La version PHP est fournie avec le paquet npm (node_modules/devtcha/php/devtcha.php) : un seul fichier, PHP 7.4 ou plus récent, extensions standard uniquement.

    Documentation complète

    FAQ

    Arrête-t-il tous les robots ?

    Non. Il rend les envois en masse coûteux, mais un robot qui exécute JavaScript passera après avoir payé le calcul. Combinez-le avec une limitation de débit et un champ piège.

    Faut-il une bannière de cookies ?

    DevTcha ne dépose aucun cookie, n'utilise aucun stockage du navigateur et ne contacte aucun tiers : il n'ajoute aucune raison d'afficher une bannière de consentement.

    Fonctionne-t-il sans JavaScript ?

    Non : sans JavaScript, aucun jeton n'est calculé et le serveur refuse le formulaire. Ajoutez un message <noscript> et proposez un autre moyen de contact.

    Est-ce un service hébergé ?

    Non. C'est une bibliothèque : chaque site délivre ses propres défis et vérifie ses propres jetons.