Um formulário de cadastro é a coisa mais barata de atacar na internet. Não tem senha para adivinhar nem cartão para roubar, e cada conta criada vale alguma coisa para alguém: um trial grátis para revender, um bônus de indicação para farmar, uma caixa de email para spam ou uma conta adormecida para uma fraude futura. Se os seus cadastros dispararam de um dia para o outro e a ativação caiu, provavelmente há um script preenchendo o formulário.
Quanto custam os cadastros falsos
- Dinheiro: créditos grátis, compute de trial, taxas de verificação por SMS e email, pagamentos de indicação.
- Dados: um funil cheio de contas que nunca vão converter esconde o que os clientes de verdade fazem.
- Reputação: emails de verificação para endereços inventados ou roubados voltam e prejudicam a sua reputação de envio.
- Abuso futuro: contas criadas hoje viram spam, scraping ou teste de cartão no mês que vem.
Por que um CAPTCHA não resolve
Serviços de resolução de CAPTCHA respondem desafios por bem menos de um centavo cada, com pessoas ou com modelos, então um atacante determinado paga pouco e passa. Os seus visitantes reais pagam o preço inteiro: cada desafio faz alguns desistirem, ainda mais no celular. Um CAPTCHA coloca o custo do lado errado.
O que entrega um cadastro feito por script
Nenhum sinal sozinho é prova, e tudo o que o atacante controla, como o User-Agent, pode ser falsificado. O que os scripts têm dificuldade de fazer é ser consistentes em muitos sinais ao mesmo tempo, e se comportar como uma pessoa ao longo do tempo.
- Sinais de automação. Navegadores headless e controlados ainda deixam rastro:
navigator.webdriver, uma GPU de software, recursos do navegador faltando. - Inconsistências. Um User-Agent que diz Windows num navegador que se apresenta como Linux, um fuso horário que não bate com a rede, client hints que contradizem os headers.
- A rede. Cadastros vindos de provedores de hospedagem em vez de casas e celulares. Sozinho, é evidência fraca: quem usa VPN também é gente.
- Fan-out. Um dispositivo, um token ou uma sub-rede criando muitas contas em minutos.
- Sem página. Uma requisição ao endpoint de cadastro feita por um cliente que nunca carregou a página de cadastro.
Decida no servidor, antes de a conta existir
A decisão fica onde a conta é criada, não no navegador, onde um script pode pulá-la. Antes de inserir o usuário, peça uma decisão sobre a requisição, com um timeout curto:
POST /v1/decide
{ "ip": "203.0.113.10", "user_agent": "Mozilla/5.0 …",
"token": "<_kz cookie>", "path": "/signup" }
Depois aja conforme a classe que voltou, da mais certa para a menos certa:
- bot_high: recuse o cadastro.
- bot: crie a conta, mas segure os créditos do trial até o email ser verificado, ou peça um número de celular.
- unknown, human, human_high: deixe passar normalmente.
Segurar a recompensa, em vez de bloquear o formulário, é o que faz o cadastro falso deixar de valer a pena, sem barrar um cliente de verdade cujo único defeito era usar uma VPN.
Fail-open
Se a checagem estiver lenta ou fora do ar, deixe o cadastro passar. Algumas contas falsas durante uma indisponibilidade custam muito menos do que uma página de cadastro que para de funcionar. Escrevemos mais sobre isso em por que uma checagem de bots precisa ser fail-open.