Seguridad en acción
Lo que pasa cuando alguien inunda tu sitio de peticiones: las primeras pasan y el resto se frena.
En vivo. Usa la API de AIM.
Como lo ve tu cliente
Un ejemplo de la vida real: Imagina el formulario de citas de un consultorio. Un bot envía mensajes falsos sin parar: después de unos pocos el sitio lo frena, y los pacientes siguen escribiendo sin problema.
Por dentro
Qué hace, en términos técnicos
Envía 15 peticiones seguidas a la API y mira cómo el límite de tasa deja pasar 10 y frena el resto con un 429, y revisa las cabeceras de seguridad reales que protegen este sitio.
- Tecnologías
- Hono
- Postgres
- Drizzle
- Preact
- Respaldado por
Arquitectura
1.Tu navegador
Envía las 15 peticiones en orden y lee de cada respuesta el estado y las cabeceras RateLimit y Retry-After.
2.API de AIM en Cloudflare (Hono)
Cuenta las peticiones de cada visitante con una huella de su IP, nunca la IP, y agrupa IPv6 por red /64.
3.Postgres en Neon (Drizzle)
Lleva la cuenta en una ventana móvil de un minuto. Pasado el límite, la API responde 429 con Retry-After.
4.Cabeceras del sitio
HSTS, X-Frame-Options, Permissions-Policy y las demás llegan con cada página. La CSP va en una etiqueta meta, con hashes.
En cifras
- peticiones por minuto por conexión
- 10
- peticiones que envía la demo
- 15
- cabeceras de seguridad revisadas en vivo
- 7
El código
Decisiones
- DEC-019: Content Security Policy estricta (se abre en otra pestaña)
- DEC-032: Visitante por red /64 y límites de la revisión OWASP (se abre en otra pestaña)
Registradas en docs/DECISIONES.md, con su contexto y las alternativas descartadas.
¿Qué pasa si alguien inunda tu sitio?
Un bot inunda el formulario
Tu navegador envía 15 peticiones reales a la API, una tras otra, como lo haría el bot.
- Pasaron
- 0
- Frenadas
- 0
Una persona que usa tu sitio nunca llega al límite. Un bot sí: después de 10 peticiones en un minuto, el sitio deja de atenderlo hasta que se libera el cupo.
Mientras tanto, un paciente
Escribe desde su propia conexión.
Quisiera una cita la próxima semana, en la tarde.
Su conexión lleva su propia cuenta: lo que haga el bot no la toca.
El límite se cuenta por conexión, con una huella de la IP y nunca la IP: frenar al bot no afecta a nadie más.
Esta parte es una ilustración y no envía nada: desde tu navegador, el paciente compartiría la conexión con el bot y el límite también lo frenaría.
Límite de tasa en vivo
La API de este sitio acepta hasta 10 peticiones por minuto desde una misma conexión. Envía 15, una detrás de otra, y mira en qué momento te frena.
Por qué importa
Sin un límite, un programa puede probar miles de contraseñas por minuto hasta dar con la tuya (fuerza bruta), o llenar un formulario con mensajes basura hasta tumbar el servicio. Frenar cada conexión después de unas cuantas peticiones corta esos abusos sin molestar a quien usa el sitio con normalidad.
En el OWASP Top 10 de 2021 esto cae en A04, diseño inseguro, y en A07, fallas de identificación y autenticación. En este sitio también tienen su propio límite el formulario de contacto, el inicio de sesión del panel y el asistente.
El conteo vive en Postgres y se lleva por conexión: la API guarda una huella irreversible de tu IP, nunca la IP.
Las protecciones que tu navegador recibió de este sitioCabeceras que protegen este sitio
Con cada página, el servidor manda instrucciones de seguridad que tu navegador obedece. Estas llegaron en la respuesta real que tu navegador acaba de recibir.Con cada página, el servidor manda instrucciones de seguridad que tu navegador obedece: las cabeceras HTTP. Esta lista sale de la respuesta real que tu navegador acaba de recibir al pedir la portada del sitio, con los valores tal como llegaron.
Revisando las cabeceras de este sitio…
¿Lo quieres para tu negocio?
Esto es parte de lo que construyo en el servicio de páginas web. Mira qué incluye o calcula un presupuesto de referencia para tu caso.
¿Te interesa cómo está hecho? Míralo por dentro
Cómo funciona
El límite es real: la API de AIM en Cloudflare acepta 10 peticiones por minuto por conexión, lleva la cuenta en Postgres con una huella de la IP (nunca la IP) y responde con las cabeceras RateLimit y Retry-After. Frena la fuerza bruta y el abuso de formularios, que el OWASP Top 10 de 2021 ubica en A04 (diseño inseguro) y A07 (fallas de identificación y autenticación). Las cabeceras se leen en vivo desde la respuesta de la portada: HTTPS obligatorio, bloqueo de marcos, política de permisos y las demás que manda el sitio, cada una con el ataque que frena y su categoría OWASP.