Anti-abuso e segurança de códigos

O código é um segredo. Tratamo-lo como tal.

Configurar em:
Cursor

Um código de uso único é tão bom quanto a forma como é gerado, armazenado e limitado por taxa. O Bird Verify gera códigos com uma fonte criptográfica, armazena apenas um hash, compara em tempo constante e limita tanto os envios quanto as tentativas — assim, um log vazado ou um ataque de força bruta não levam o invasor a lugar nenhum. A pontuação de fraude é construída sobre esta base a seguir.

verify.ts
200 · pending
import { BirdClient } from "@messagebird/sdk";

const bird = new BirdClient({
  apiKey: process.env.BIRD_API_KEY!,
});

// Send the code, then check it by recipient.
await bird.verify.verifications.create({
  to: { phone_number: "+15551234567" },
}).safe();

const { data, error } = await bird.verify.verifications.check({
  to:   { phone_number: "+15551234567" },
  code: userInput,
}).safe();
if (error) throw error;

Segurança ativa por padrão, não um complemento.

Cada verificação na API do Bird Verify conta com as mesmas proteções: o código é gerado no servidor, nunca é retornado e é armazenado apenas como hash; as verificações são executadas em tempo constante e com um limite de tentativas; e os envios são limitados por destinatário e por workspace. Não é necessário ativar nem configurar nada: é assim que a API funciona, seja para login com dois fatores ou acesso sem senha.

Cinco proteções em cada verificação.

Sem passos de configuração, sem complementos pagos.

  1. 01

    Geração criptográfica.

    Os códigos são gerados a partir de uma fonte aleatória criptográfica, uniformemente distribuídos pelo espaço de códigos, sem contadores ou timestamps previsíveis.

  2. 02

    Armazenado como hash, nunca exposto na saída.

    Apenas um HMAC-SHA256 de cada código é armazenado; o texto original nunca é devolvido pela API nem escrito no seu stack ou nos nossos logs.

  3. 03

    Comparação em tempo constante.

    Os códigos submetidos são comparados em tempo constante, para que um atacante não obtenha informação a partir da duração da verificação.

  4. 04

    Bloqueio por tentativas.

    Cada sessão tem um número limitado de verificações (5 por padrão). Quando se esgotam, a sessão falha, impedindo tentativas infinitas.

  5. 05

    Limites de envio.

    Um limite de envio por destinatário e um intervalo mínimo entre reenvios controlam os custos e a superfície de abuso, cada um com um 429 e Retry-After.

As tentativas esgotam-se antes dos seus utilizadores.

A wrong code comes back with the attempts remaining, and the session fails once the budget is spent, so a brute-force loop hits a wall long before it finds the code.

lockout.ts
200
const { data, error } = await bird.verify.verifications.check({
  to:   { phone_number: "+15551234567" },
  code: guess,
}).safe();
if (error) throw error;

// wrong code, attempts left → { success: false, reason: "incorrect_code", attempts_remaining: 2 }
// budget spent, session done → { success: false, reason: "attempts_exhausted", attempts_remaining: null }
Em breve

Em breve: sinais de fraude e proteção contra SMS pumping.

O histórico por envio que o Verify regista hoje é a base para uma camada antifraude que estamos a construir agora. Ela utiliza as mesmas chamadas de criação e verificação, por isso adotá-la depois é uma mudança de configuração, não uma reintegração.

Sinais de risco na criação. Envie contexto de dispositivo, IP e requisição numa verificação, e tentativas de alto risco recebem um resultado de bloqueio antes mesmo de o código ser enviado — assim, não paga para enviar mensagens a um invasor.

Proteção contra SMS pumping e AIT. Limites de envio por país e por prefixo, mais um teto de gastos por workspace, bloqueiam o ataque de tráfego artificialmente inflacionado que direciona OTP para números premium para partilha de receita com operadoras.

Construído sobre o que já existe. A decisão de risco lê o histórico de tentativas que o Verify mantém desde o primeiro dia, e o resultado de bloqueio já faz parte do modelo de status — assim, a camada antifraude é implementada sem reformular a sua integração.

Códigos gerados, armazenados e com limites de taxa como devem ser.

A segurança está integrada no Bird Verify, não é vendida à parte: os canais, o código e os limites são os mesmos dois endpoints.

Comece com um canal.
Adicione os outros quando estiver pronto.

Uma chave API de teste é sua imediatamente. A produção é desbloqueada quando você adiciona um método de pagamento e verifica um remetente.

Usa Claude Code, Cursor ou Codex? Copie um prompt de configuração e o seu agente instala o Bird CLI e as skills por si. Escolha o seu:

Cursor