MAISON CODE .
/ Security · Cloudflare · Bots · Infrastructure · Redis · Architecture

Atténuation des robots : la guerre contre les revendeurs

Les robots baskets mangent votre inventaire. Un guide technique pour vaincre les scalpers automatisés à l'aide de Cloudflare Turnstile, Honeypots et Redis Rate Limiting.

AB
Alex B.
Atténuation des robots : la guerre contre les revendeurs

Si vous lancez un produit à la mode sur Shopify (par exemple, une sortie limitée de baskets) sans protection, vous le vendrez en 1 seconde. Cela ressemble à un « bon problème ». Ce n’est pas. Parce que 98 % de l’inventaire est allé à un seul revendeur à Chicago exécutant un script Python. Vos clients fidèles, c’est-à-dire les personnes qui portent réellement la marque, n’ont rien reçu. Ils sont en colère. Ils tweetent. Ils partent.

Bot Mitigation n’est pas un ticket informatique. C’est la protection de la marque. Chez Maison Code Paris, nous concevons des systèmes de « Fair Launch » qui garantissent la victoire de l’humain.

Pourquoi Maison Code en parle

Chez Maison Code Paris, nous agissons comme la conscience architecturale de nos clients. Nous héritons souvent de stacks “modernes” construites sans compréhension fondamentale de l’échelle.

Nous abordons ce sujet car il représente un point de pivot critique dans la maturité de l’ingénierie. Une mise en œuvre correcte différencie un MVP fragile d’une plateforme résiliente de niveau entreprise.

Pourquoi Maison Code discute de la protection contre les robots

Nous avons combattu les robots les plus sophistiqués au monde. Nous avons vu des robots capables de résoudre reCAPTCHA V3. Nous avons vu des robots utiliser des proxys résidentiels pour ressembler à des utilisateurs d’iPhone dans 50 États. Nous savons que « Installer un plug-in » ne suffit pas. Vous avez besoin d’une Défense en couches. Nous partageons notre stratégie afin que vous puissiez vous préparer à la guerre.

1. Le modèle de menace : comment fonctionnent les robots

Pour arrêter un bot, vous devez penser comme un développeur de bot. La plupart des robots ne « parcourent » pas votre site.

  1. Surveiller : ils interrogent votre point de terminaison « products.json » toutes les 50 ms.
  2. Cart : Ils contournent entièrement l’interface utilisateur et POST /cart/add.js directement.
  3. Paiement : Ils utilisent des « Liens de préchargement » pour remplir automatiquement les frais d’expédition/facturation.
  4. Proxies : ils acheminent le trafic via 10 000 IP résidentielles (appareils IoT piratés).
  5. Captcha : ils utilisent des fermes d’API (2Captcha) où les humains dans les fermes de clics résolvent des captchas pour 0,001 €.

2. Couche 1 : Le défi invisible (Cloudflare Turnstile)

L’ancien reCAPTCHA de Google (Cliquez sur les feux tricolores) détruit les taux de conversion. Nous utilisons Cloudflare Turnstile. C’est “Invisible”. Il exécute un défi de preuve de travail JavaScript en arrière-plan du navigateur. Si le visiteur est un script sans tête (Puppeteer/Selenium), il échoue à la vérification.

Implémentation dans Remix (Hydrogen)

Nous intégrons Turnstile dans le flux de soumission « Formulaire ».

// application/composants/Turnstile.tsx
importer { useEffect, useRef } depuis 'react' ;

fonction d'exportation Tourniquet({ siteKey, action }) {
  const ref = useRef(null);
  
  utiliserEffet(() => {
    si (fenêtre.tourniquet) {
      window.turnstile.render(ref.courant, {
        clé du site : clé du site,
        action: action, // par exemple, 'checkout-start'
        rappel : fonction (jeton) {
           // Injecter le jeton dans l'entrée cachée
           document.getElementById('cf-token').value = jeton;
        }
      });
    }
  }, []);

  return <div ref={ref} />;
}

Validation côté serveur

Ne faites jamais confiance au client. Un bot peut envoyer un faux token. Vous devez le vérifier avec l’API de Cloudflare.

// app/routes/api.checkout.ts
exporter l'action de la fonction asynchrone ({requête}) {
  const formData = wait request.formData();
  const token = formData.get('cf-turnstile-response');
  const ip = request.headers.get('CF-Connecting-IP');

  résultat const = wait fetch('https://challenges.cloudflare.com/turnstile/v0/siteverify', {
      méthode : 'POST',
      corps : nouveaux URLSearchParams({
          secret : process.env.TURNSTILE_SECRET,
          réponse : jeton,
          ip distant : ip
      })
  });

  const result = attendre result.json();
  si (! résultat. succès) {
      throw new Response("Bot détecté", { status: 403 });
  }
}

3. Couche 2 : Le Honeypot (Simple mais Efficace)

Les robots sont souvent stupides. Ils trouvent chaque champ <input> et le remplissent. On ajoute un “Pot de Miel”. Un champ caché qu’un humain ne peut pas voir (CSS caché). Si le serveur reçoit une valeur dans ce champ, nous bannissons instantanément l’IP.

<div style={{ opacité : 0, position : 'absolue', haut : 0, gauche : 0, hauteur : 0, largeur : 0, zIndex : -1 }}>
    <label htmlFor="website_url">Site Web</label>
    <input type="text" name="website_url" tabIndex={-1} autoComplete="off" />
</div>

Remarque : N’utilisez pas « display : none ». Les robots intelligents ignorent les éléments « display : none ». Utilisez « opacité : 0 » ou déplacez-le hors de l’écran (« gauche : -9999px »).

4. Couche 3 : Limitation du débit (seau de jetons Redis)

Un humain ne peut pas ajouter un article au panier 50 fois en 1 seconde. Nous mettons en œuvre une limitation de débit stricte au niveau de la couche application (Vercel Middleware). Nous utilisons Redis (Upstash) pour suivre le nombre de demandes.

Algorithme : Fenêtre coulissante.

  • Clé : ratelimit:ip:192.168.1.1
  • Limite : 5 requêtes / 10 secondes.
// middleware.ts
importer { Redis } depuis '@upstash/redis' ;
importer { Ratelimit } depuis '@upstash/ratelimit' ;

const ratelimit = nouveau Ratelimit ({
  redis : Redis.fromEnv(),
  limiteur : Ratelimit.slidingWindow(5, '10 s'),
});

exporter le middleware de fonction asynchrone par défaut (demande) {
  const ip = requête.ip || '127.0.0.1';
  const { succès } = wait ratelimit.limit(ip);
  
  si (!succès) {
      return new Response("Trop de demandes", { status: 429 });
  }
}

Coût : cela ajoute une latence d’environ 20 ms. Nous l’appliquons uniquement aux routes mutation (POST), pas aux routes read (GET).

5. Couche 4 : La salle d’attente virtuelle (file d’attente)

Parfois, le trafic est réel (100 000 vrais fans). Il s’agit d’une attaque DDoS par amour. Votre base de données va planter. Pour résoudre ce problème, nous implémentons un Queue System (comme Queue-it, mais personnalisé).

  1. Choke Point : tout le trafic atteint le Edge.
  2. Contrôle de capacité : “Est-ce que active_users < 1000 ?”
  3. Redirection : si complet, redirigez vers la page HTML statique /waiting-room.
  4. Sondage : le client interroge /api/status.
  5. Admettre : lorsque la capacité s’ouvre, émettez un cookie JWT signé (queue_pass).

Cela garantit que vos appels d’API Shopify ne dépassent jamais la limite de limitation.

6. La course aux armements : analyse comportementale

Les robots avancés (furtifs) imitent parfaitement les empreintes digitales du navigateur. Nous passons à la biométrie comportementale. Nous suivons :

  • Trajectoire de la souris : les humains se déplacent efficacement dans les courbes. Les robots se déplacent en lignes droites ou se téléportent.
  • Temps de pression des touches : les humains ont des écarts variables entre les frappes. Les robots tapent à des intervalles exactement de 50 ms.
  • Accéléromètre : les appareils mobiles tremblent légèrement. Les serveurs ne le font pas.

Nous envoyons cette télémétrie à un moteur de fraude (Sift/Forter).

7. L’économie du botting

Pourquoi les gens bottent-ils ? Profit. Une paire de Jordan Travis Scotts coûte 150 €. Se revend 1 200 €. Bénéfice : 1 050 € par paire. Si un bot sécurise 50 paires, cela représente un bénéfice de 50 000 € en 1 heure. C’est pourquoi ils dépensent 5 000 € en licences de robots (CyberAIO) et 1 000 € en proxys. Notre travail : Faites en sorte que le coût du gain soit supérieur à 1 200 €. Nous faisons cela en introduisant le « Réatoire » (tirages au sort) et le « Friction » (vérification de l’âge du compte). “Seuls les comptes créés il y a plus de 3 mois peuvent acheter cette récompense.” Cela tue la stratégie « Créez 1 000 comptes aujourd’hui ».

8. Chiffrement côté client (protection de la charge utile)

Les robots adorent procéder à la rétro-ingénierie de votre API. Ils surveillent l’onglet Réseau. Ils voient POST /cart { id : 123 }. Ils le reproduisent en Python. Défense : chiffrez la charge utile.

  1. Module WASM : Nous compilons une fonction de chiffrement C++ sur WebAssembly.
  2. Cryptage : Le navigateur crypte la charge utile du panier enc_abcd123....
  3. Déchiffrement : Le serveur utilise la clé privée pour décrypter. Les robots ne peuvent pas exécuter facilement le WASM (cela nécessite un environnement de navigateur complet). Ils ne peuvent pas effectuer de rétro-ingénierie du code C++ (il est binaire). Cela relève considérablement la barre.

9. Action en justice (cessation et abstention)

Parfois, la technologie échoue. Si un fournisseur de robots spécifique (par exemple, « Dragon AIO ») vous cible spécifiquement, impliquez les services juridiques. Nike a poursuivi StockX. Ticketmaster a poursuivi les scalpers. Mettez à jour vos Conditions d’utilisation : “L’utilisation d’un logiciel d’automatisation constitue une rupture de contrat.” Cela vous permet d’annuler légalement des commandes sans rembourser les frais d’expédition. Rendez-le douloureux. Les botters sont des entreprises. Si vous augmentez leur risque juridique, ils se dirigent vers une cible plus douce.

10. Conclusion

L’atténuation des robots est une guerre économique. Vous ne pouvez pas arrêter 100 % des robots. Votre objectif est d’augmenter le coût de l’attaque au-dessus du bénéfice potentiel. Si l’achat d’une licence de robot coûte 500 €, que les proxys coûtent 50 € et que le bénéfice de la revente de votre chaussure n’est que de 200 €… les botters disparaîtront.


**[Engagez nos Architectes](/contact)**.