Korzen

Blog

Fail open: waarom een botcheck je site nooit plat mag leggen

Een botcheck staat vóór je waardevolste pagina's. Als hij fail-closed is, is zijn storing jouw storing. Hoe je er een aanroept zodat hij het alleen maar beter kan maken.

Een botcheck zit op de pagina's die het meest tellen: de login, de registratie, de checkout. Dat maakt hem nuttig, en ook gevaarlijk. Als elke checkout op hem wacht, is je checkout traag op de dag dat hij traag is; op de dag dat hij down is, ben jij het ook.

Fail open of fail closed

Als de check geen antwoord kan geven, zijn er twee keuzes. Fail closed blokkeert de bezoeker: veilig tegen bots, fataal voor de business, want elke echte klant wordt ook geblokkeerd. Fail open laat de bezoeker door: tijdens de storing komen bots binnen zoals vóórdat je een check had, en verder merkt niemand iets.

Voor bijna elke site is fail open de juiste keuze. Een paar minuten zonder botbescherming kost een beetje; een paar minuten zonder checkout kost veel, plus het vertrouwen van de mensen die het zagen.

Vier regels voor het aanroepen van een botcheck

  1. Een korte timeout. Kies het maximum dat je aan de pagina wilt toevoegen, 100 tot 200 ms, en dwing het af in je code. Reken nooit op de snelheid van de provider.
  2. Elke fout laat de bezoeker door. Een timeout, een verbindingsfout, een 5xx, een 402 voor een opgebruikt plan of een body die je niet kunt parsen: het betekent allemaal "geen antwoord", en geen antwoord betekent doorgaan.
  3. Handel alleen op een zeker antwoord. Blokkeer bij de hoogste bot-klasse; bij zwakker bewijs voeg je frictie toe, zoals een code per e-mail, nooit een muur.
  4. Log de missers. Tel de timeouts en fouten, zodat een storing een grafiek is en geen raadsel.

Hoe het eruitziet in code

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

De catch is het hele beleid: wat er ook misgaat wordt null, en null is nooit een bot.

Ook de browserkant is fail-open

Het script op je pagina mag de pagina evenmin ophouden. Als het de dienst niet kan bereiken, werkt de pagina precies zoals zonder het script; de beslissing van de server heeft die keer gewoon minder bewijs.

Hoe Bot Protection hiervoor is gebouwd

Bot Protection is een call vanaf je server, geen proxy vóór je site, dus het zit nooit in het pad van een request die je niet zelf wilde laten controleren. De tag wacht een begrensde tijd en geeft het dan stil op. Bij je bestedingslimiet antwoordt het met 402, wat je code als elke andere fout behandelt: bezoekers komen gewoon door, en je krijgt een e-mail voordat het zover is.