Antiabuso y seguridad de códigos

El código es un secreto. Lo tratamos como tal.

Configurar en:
Cursor

Un código de un solo uso es tan bueno como la forma en que se genera, almacena y limita en frecuencia. Bird Verify genera códigos con una fuente criptográfica, almacena solo un hash, compara en tiempo constante y limita tanto los envíos como los intentos de adivinación, de modo que un registro filtrado o un ataque de fuerza bruta no le sirven de nada al atacante. La puntuación de fraude se construye sobre esta base a continuación.

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;

Seguridad activa por defecto, no un complemento.

Cada verificación en la API de Bird Verify cuenta con las mismas protecciones: el código se genera en el servidor, nunca se devuelve y se almacena solo como hash; las comprobaciones se ejecutan en tiempo constante y contra un presupuesto limitado de intentos; y los envíos se limitan por destinatario y por workspace. No hace falta activar ni configurar nada de esto: así es como funciona la API, ya sea que la utilice como inicio de sesión con dos factores o como acceso sin contraseña.

Cinco protecciones en cada verificación.

Sin pasos de configuración, sin complementos adicionales.

  1. 01

    Generación criptográfica.

    Los códigos se obtienen de una fuente aleatoria criptográfica, distribuidos uniformemente en el espacio de códigos, no de un contador o marca de tiempo predecible.

  2. 02

    Hash en reposo, nunca en texto plano de salida.

    Solo se almacena un HMAC-SHA256 de cada código; el texto plano nunca es devuelto por la API ni se escribe en su stack o en nuestros registros.

  3. 03

    Comparación en tiempo constante.

    Los códigos enviados se comparan en tiempo constante, por lo que un atacante no obtiene información del tiempo que tarda una verificación.

  4. 04

    Bloqueo por intentos.

    Cada sesión tiene un número limitado de comprobaciones (5 por defecto). Una vez agotadas, la sesión falla, por lo que los intentos de adivinación no pueden continuar indefinidamente.

  5. 05

    Límites de envío.

    Un límite de envío por destinatario y un tiempo de espera para reenvíos acotan el gasto y la superficie de abuso, cada uno con un 429 con Retry-After.

Los intentos se agotan antes que la paciencia de sus usuarios.

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 }
Próximamente

Próximamente: señales de fraude y protección contra SMS pumping.

El historial por envío que Verify registra hoy es la base para una capa antifraude que estamos desarrollando ahora. Funciona sobre las mismas llamadas de creación y comprobación, por lo que adoptarla más adelante es un cambio de configuración, no una reintegración.

Señales de riesgo en la creación. Incluya el dispositivo, la IP y el contexto de la solicitud en una verificación: los intentos de alto riesgo reciben un resultado de bloqueo antes de que se envíe un código, para que no pague por enviar mensajes a un atacante.

Protección contra SMS pumping y AIT. Límites de envío por país y por prefijo, más un techo de gasto por workspace, detienen el ataque de tráfico inflado artificialmente que dirige OTP a rangos de números premium para compartir ingresos con operadores.

Construido sobre lo que ya existe. La evaluación de riesgo lee el historial de intentos que Verify guarda desde el primer día, y el resultado de bloqueo ya forma parte del modelo de estados, por lo que la capa antifraude se integra sin modificar su implementación.

Códigos generados, almacenados y con límites de frecuencia como debe ser.

La seguridad está integrada en Bird Verify, no se vende aparte: los canales, el código y los límites son los mismos dos endpoints.

Empieza con un canal.
Añade los demás cuando estés listo.

Una clave API de prueba es tuya de inmediato. El acceso a producción se desbloquea cuando añades un método de pago y verificas un remitente.

¿Usas Claude Code, Cursor o Codex? Copia un prompt de configuración y tu agente instalará el Bird CLI y las habilidades por ti. Elige el tuyo:

Cursor