Korzen

Blog

Fail-open: por que uma checagem de bots nunca pode derrubar o seu site

Uma checagem de bots fica na frente das suas páginas mais valiosas. Se ela for fail-closed, quando ela cair, você cai junto. Como integrá-la de forma que ela só possa ajudar.

Uma checagem de bots fica nas páginas que mais importam: o login, o cadastro, o checkout. É isso que a torna útil, e também o que a torna perigosa. Se todo checkout espera por ela, no dia em que ela estiver lenta o seu checkout fica lento; no dia em que ela cair, você cai junto.

Fail-open, fail-closed

Quando a checagem não consegue responder, há duas escolhas. Fail-closed bloqueia o visitante: seguro contra bots, fatal para o negócio, porque todo cliente de verdade também é bloqueado. Fail-open deixa o visitante passar: durante a indisponibilidade, os bots entram como entravam antes de você ter uma checagem, e mais ninguém percebe.

Para quase todo site, fail-open é o certo. Alguns minutos sem proteção contra bots custam pouco; alguns minutos sem checkout custam muito, inclusive a confiança de quem viu.

Quatro regras para chamar uma checagem de bots

  1. Um timeout curto. Escolha o máximo que você aceita somar à página, de 100 a 200 ms, e imponha no seu código. Nunca dependa de o outro lado ser rápido.
  2. Qualquer erro deixa o visitante passar. Um timeout, um erro de conexão, um 5xx, um 402 de plano esgotado ou uma resposta que você não consegue ler: tudo significa "sem resposta", e sem resposta significa seguir em frente.
  3. Só aja com uma resposta clara. Bloqueie na classe de bot mais alta; com evidência mais fraca, adicione atrito, como um código por email, nunca um muro.
  4. Registre o que falhou. Conte os timeouts e erros, para que uma indisponibilidade vire um gráfico, não um mistério.

Como fica no código

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();
// qualquer outra coisa, inclusive sem resposta: siga em frente

O catch é a política inteira: o que der errado vira null, e null nunca é um bot.

O lado do navegador também é fail-open

O script na sua página também nunca deve travá-la. Se não conseguir falar com o serviço, a página funciona exatamente como funcionaria sem ele; a decisão do servidor só tem menos evidência daquela vez.

Como o Bot Protection foi pensado para isso

O Bot Protection é uma chamada do seu servidor, não um proxy na frente do seu site, então ele nunca fica no caminho de uma requisição que você não escolheu checar. A tag espera um tempo limitado e desiste em silêncio. Ao atingir o seu limite de gasto, ele responde 402, que o seu código trata como qualquer outro erro: os visitantes passam, e você recebe um email antes de isso acontecer.