Un formulario de registro es lo más barato de atacar en internet. No tiene contraseña que adivinar ni tarjeta que robar, y cada cuenta que crea vale algo para alguien: una prueba gratis para revender, un bono de referido para explotar, un buzón para spam o una cuenta dormida para un fraude futuro. Si tus registros se dispararon de un día para otro y la activación cayó, probablemente hay un script llenando el formulario.
Cuánto cuestan los registros falsos
- Dinero: créditos gratis, cómputo de prueba, tarifas de verificación por SMS y email, pagos por referidos.
- Datos: un embudo lleno de cuentas que nunca convertirán esconde lo que hacen los clientes reales.
- Reputación: los emails de verificación a direcciones inventadas o robadas rebotan y dañan tu reputación de envío.
- Abuso futuro: las cuentas creadas hoy se usan para spam, scraping o pruebas de tarjetas el mes que viene.
Por qué un CAPTCHA no es la respuesta
Los servicios de resolución de CAPTCHA responden acertijos por mucho menos de un centavo cada uno, con personas o con modelos, así que un atacante decidido paga poco y pasa. Tus visitantes reales pagan el precio completo: cada acertijo hace desistir a algunos, más aún en el celular. Un CAPTCHA pone el costo del lado equivocado.
Qué delata a un registro hecho por un script
Ninguna señal sola es prueba, y todo lo que controla el atacante, como el User-Agent, se puede falsificar. Lo que a los scripts les cuesta es ser consistentes en muchas señales a la vez, y comportarse como una persona a lo largo del tiempo.
- Señales de automatización. Los navegadores headless y controlados todavía dejan rastro:
navigator.webdriver, una GPU por software, funciones del navegador que faltan. - Inconsistencias. Un User-Agent que dice Windows en un navegador que se presenta como Linux, una zona horaria que no coincide con la red, client hints que contradicen los headers.
- La red. Registros desde proveedores de hosting en lugar de hogares y celulares. Sola, es evidencia débil: quien usa VPN también es una persona.
- Fan-out. Un dispositivo, un token o una subred creando muchas cuentas en minutos.
- Sin página. Una solicitud al endpoint de registro desde un cliente que nunca cargó la página de registro.
Decide en el servidor, antes de que exista la cuenta
La decisión va donde se crea la cuenta, no en el navegador, donde un script puede saltarla. Antes de insertar al usuario, pide una decisión sobre la solicitud, con un timeout corto:
POST /v1/decide
{ "ip": "203.0.113.10", "user_agent": "Mozilla/5.0 …",
"token": "<_kz cookie>", "path": "/signup" }
Luego actúa según la clase que recibiste, de la más segura a la menos segura:
- bot_high: rechaza el registro.
- bot: crea la cuenta pero retén los créditos de prueba hasta que se verifique el email, o pide un número de celular.
- unknown, human, human_high: deja pasar como siempre.
Retener la recompensa, en lugar de bloquear el formulario, es lo que hace que los registros falsos dejen de valer la pena, sin rechazar a un cliente real cuyo único defecto era usar una VPN.
Fail-open
Si la verificación está lenta o caída, deja pasar el registro. Algunas cuentas falsas durante una caída cuestan mucho menos que una página de registro que deja de funcionar. Escribimos más sobre esto en por qué una verificación de bots debe ser fail-open.