Korzen

Blog

Fail open: perché un controllo bot non deve mai mandare giù il tuo sito

Un controllo bot sta davanti alle tue pagine più preziose. Se è fail closed, il suo disservizio è il tuo disservizio. Come chiamarlo in modo che possa solo migliorare le cose.

Un controllo bot sta sulle pagine che contano di più: il login, la registrazione, il checkout. È questo che lo rende utile, ed è anche questo che lo rende pericoloso. Se ogni checkout lo aspetta, il giorno in cui è lento il tuo checkout è lento; il giorno in cui è giù, sei giù anche tu.

Fail open o fail closed

Quando il controllo non riesce a rispondere, le scelte sono due. Fail closed blocca il visitatore: sicuro contro i bot, fatale per il business, perché viene bloccato anche ogni cliente vero. Fail open lascia passare il visitatore: durante il disservizio i bot entrano come prima che avessi un controllo, e nessun altro se ne accorge.

Per quasi tutti i siti, fail open è la scelta giusta. Qualche minuto senza protezione dai bot costa poco; qualche minuto senza checkout costa molto, oltre alla fiducia di chi se n'è accorto.

Quattro regole per chiamare un controllo bot

  1. Un timeout breve. Scegli il massimo che sei disposto ad aggiungere alla pagina, da 100 a 200 ms, e imponilo nel tuo codice. Non contare mai sul fatto che il fornitore sia veloce.
  2. Qualsiasi errore lascia passare il visitatore. Un timeout, un errore di connessione, un 5xx, un 402 per un piano esaurito o un body che non riesci a interpretare: significano tutti "nessuna risposta", e nessuna risposta significa andare avanti.
  3. Agisci solo su una risposta certa. Blocca sulla classe bot più alta; con prove più deboli aggiungi attrito, come un codice via email, mai un muro.
  4. Registra le risposte mancate. Conta i timeout e gli errori, così un disservizio è un grafico e non un mistero.

Come appare nel codice

const d = await fetch(API + "/v1/decide", {
  method: "POST",
  headers: { Authorization: `Bearer ${KEY}` },
  body: JSON.stringify({ ip, user_agent, token, path }),
  signal: AbortSignal.timeout(150),
}).then((r) => r.json()).catch(() => null);

if (d?.class === "bot_high") return res.status(403).end();
// anything else, including no answer: carry on

Il catch è tutta la policy: qualunque cosa vada storta diventa null, e null non è mai un bot.

Anche il lato browser è fail open

Nemmeno lo script sulla tua pagina deve mai bloccarla. Se non riesce a raggiungere il servizio, la pagina funziona esattamente come funzionerebbe senza; la decisione del server avrà semplicemente meno prove quella volta.

Come Bot Protection è costruito per questo

Bot Protection è una chiamata dal tuo server, non un proxy davanti al tuo sito, quindi non è mai nel percorso di una richiesta che non hai scelto di controllare. Il suo tag aspetta un tempo limitato e poi rinuncia in silenzio. Al raggiungimento del tuo limite di spesa risponde 402, che il tuo codice tratta come qualsiasi altro errore: i visitatori passano, e tu ricevi un'email prima che succeda.