Pular para o conteúdo
Tutorial

Verifique e-mails violados na inscrição sem executar o HaveIBeenPwned você mesmo

| 6 min read

Capture credenciais comprometidas antes de armazená-las. Uma única chamada de API, um manipulador de rota Next.js e um validador React Hook Form que adiciona 40 ms à latência de inscrição.

Login form on a screen representing signup flow and breach checks
Photo by Markus Spiske on Unsplash

Um usuário que retorna digita sua senha favorita em seu formulário de inscrição. Essa senha vazou no despejo da AT&T de 2024, na violação 23andMe de 2023 e na extração do cofre do LastPass em 2022. Você armazena o hash, parabeniza-se pelo bcrypt e, três semanas depois, um bot de preenchimento de credenciais entra na conta vindo de um proxy residencial no Brasil.

A solução é barata. Uma chamada de API na inscrição informa se o e-mail aparece em corpora de violação conhecida. Use esse sinal para forçar a MFA, exigir uma senha mais forte ou colocar a inscrição em uma fila de revisão. Esta postagem mostra o endpoint, um manipulador de rota Next.js e um validador React Hook Form que adiciona cerca de 40 ms à latência de sua inscrição.

Por que verificar a violação na inscrição e não depois

O preenchimento de credenciais funciona porque 65% dos usuários reutilizam senhas em sites (Google/Harris 2019, replicado na pesquisa Bitwarden de 2023). Um e-mail vinculado a 14 violações anteriores não é uma amostra aleatória da Internet; é um usuário que entregou a mesma senha a 14 fornecedores diferentes que vazaram. A probabilidade marginal de que eles tenham digitado o mesmo em seu formulário é alta.

A verificação na inscrição custa uma viagem de ida e volta. A verificação após uma aquisição custa um tíquete de suporte, um reembolso, uma análise de confiança e segurança e, muitas vezes, uma notificação de violação do GDPR. Você deseja o sinal antes que a senha chegue à sua tabela de usuários, não depois.

Uma chamada de API, dois sinais

POST /v1/breach/check aceita um e-mail ou uma senha. Aqui está a chamada por e-mail.

E um exemplo de resposta para um endereço que aparece em três corpora.

Duas coisas que vale a pena destacar. breach_count e o breaches array fornece nomes de conjuntos de dados, datas e contagens totais de registros; eles não retornam a senha exposta, o registro completo vazado ou qualquer PII além do que você enviou. password_exposed só é preenchido quando você passa por um password campo no corpo da solicitação. Para a inscrição, apenas o e-mail é suficiente para avaliar o risco.

A API k-anonimato do HaveIBeenPwned é gratuita para uso pessoal e excelente para pesquisas de prefixo de senha. Em escala de produção, você paga US$ 3,50/mês por chave e mantém o tratamento de prefixo SHA-1, além de limites de taxa do lado do cliente. O endpoint botoi envolve esse encanamento e adiciona cache de borda, autenticação unificada com o restante da API e uma única conta.

Manipulador de rota Next.js

Coloque a chamada atrás de sua própria rota para que a chave da API permaneça no servidor. Valide a entrada com Zod, adicione um tempo limite de AbortController de 300 ms e falhe na abertura em erros de upstream para que uma verificação de violação lenta nunca bloqueie uma inscrição real.

Algumas opções de design que valem a pena citar. O tempo limite é curto (300ms) porque a resposta do P95 é de 120ms e qualquer coisa mais lenta é transitória; a ramificação com falha aberta retorna risk: 'low' portanto, um terceiro esquisito não pode retirar seu formulário de inscrição. O tier() A função é o único lugar onde reside a política de risco, o que torna difícil reajustá-la mais tarde.

Validador de formulário React Hook do lado do cliente

Debounce em 500 ms para não disparar uma solicitação a cada pressionamento de tecla. Não bloqueie o botão enviar no resultado; mostre um aviso e pré-alterne o MFA. Os avisos são convertidos; blocos rígidos fazem com que você perca o usuário.

Conecte o gancho em um componente React Hook Form. O watch call alimenta o e-mail no gancho e o resultado verifica previamente a caixa MFA em busca de endereços violados.

O que fazer com o resultado

Traduza a contagem de violações em uma política. Comece com esta tabela e ajuste assim que tiver duas semanas de inscrições atrás da pontuação.

Contagem de violações Ação Experiência do usuário Por que
0 Prosseguir Sem alteração Nenhuma evidência pública de compromisso prévio; caminho padrão.
1-3 Solicitar MFA Marque previamente a caixa MFA, mostre um aviso suave É comum uma senha reutilizada por violação; cutucar o usuário para proteger a nova conta.
4-10 Forçar MFA + senha forte Exigir inscrição no TOTP antes do primeiro login, mínimo de 14 caracteres A exposição repetida sugere que o e-mail está em todas as principais listas de credenciais; uma senha fraca aqui é uma aquisição esperando para acontecer.
10+ Bloco macio com fricção Adicione um captcha ou envie para revisão manual Este e-mail é efetivamente público. Aumente o custo do invasor antes de criar uma conta nele.

Empilhe-o com mais duas verificações por menos de 120 ms

Somente a verificação de violação detecta o risco de senha reutilizada. Combine com /v1/disposable-email/check para sinalizar domínios de email temporário e /v1/vpn-detect para sinalizar IPs de datacenter ou de origem Tor, e você tem um scorecard de três sinais que funciona em paralelo abaixo de 120 ms no P95. O padrão de pontuação completo (pesos, limites, registro de auditoria) reside em Evite fraudes de inscrição com 3 verificações de API.

Obtenha uma chave de API gratuita em botoi.com/api/signup. O nível gratuito cobre 1.000 verificações de violação por dia (5 req/min burst), o suficiente para um pequeno SaaS ou para reproduzir seus últimos 30 dias de inscrições por meio do endpoint e calibrar os níveis acima contra dados de rotatividade e abuso.

Referência completa do endpoint: API de verificação de violação.

FAQ

Isso vaza endereços de e-mail para o botoi?
O e-mail chega à API por TLS e é usado apenas para calcular a correspondência de violação. Os corpos de solicitação não persistem nos logs de acesso; apenas método, caminho, status e latência são retidos por 30 dias. Consulte a documentação da API para obter a instrução completa de manipulação de dados.
Qual é a latência típica?
O tempo médio de resposta é de 40 ms em um nó de borda Cloudflare Workers, 120 ms no percentil 95. O manipulador nesta postagem define um tempo limite de AbortController de 300 ms para que uma chamada lenta não possa bloquear seu formulário de inscrição.
Quão atualizado é o conjunto de dados de violação?
O conjunto de dados é sincronizado semanalmente a partir de dumps públicos (violações rastreadas por HIBP, listas de preenchimento de credenciais e coleções nº 1 a nº 5). Novos corpora aparecem em até 7 dias após a divulgação pública.
Posso verificar as senhas diretamente?
Sim. POST um prefixo SHA-1 (primeiros 5 caracteres hexadecimais) ou a senha em texto simples para o mesmo endpoint. O formato de prefixo é mais seguro para chamadores do lado do cliente porque o hash completo nunca sai do navegador. Use texto simples apenas do seu servidor.
Isso é compatível com o GDPR?
A verificação de violações é uma medida de segurança nos termos do Artigo 32 do GDPR (segurança do processamento). Documente a verificação em seus Registros de Atividades de Processamento, liste a Botoi como processadora em seu DPA e anote a base legal (interesse legítimo em impedir a tomada de conta).

Comece a construir com botoi

150+ endpoints de API para consultas, processamento de texto, geração de imagens e utilitários para desenvolvedores. Plano gratuito, sem cartão de crédito.