Las APIs son la parte más expuesta de tu aplicación: públicas por diseño, documentadas por conveniencia y muchas veces lo último que se testea. Este checklist convierte el OWASP API Security Top 10 en controles concretos para correr antes de cada release.
1. Autenticación
- Todo endpoint no público rechaza requests sin token (401).
- Tokens expirados o manipulados se rechazan; firma y expiración del JWT validadas en el servidor.
- Ningún endpoint acepta credenciales en la URL o query string.
OWASP API2: Autenticación rota.
2. Autorización (la más importante)
- A nivel de objeto: cada request con un ID verifica que el usuario actual es dueño del recurso. Cambiar el ID a otro usuario debe devolver 403/404, no sus datos.
- A nivel de función: las rutas de admin rechazan tokens de usuarios normales.
- A nivel de propiedad: el usuario no puede setear campos protegidos (
role,isAdmin) por mass assignment.
OWASP API1 (BOLA), API3, API5, los riesgos más explotados.
// El control BOLA que todo endpoint necesita
const order = await db.order.findFirst({
where: { id: params.id, userId: session.user.id },
})
if (!order) return new Response(null, { status: 404 })3. Rate limiting
- Login, signup, reset de contraseña y pagos están limitados.
- La paginación tiene tope; el tamaño del body está limitado.
OWASP API4: Consumo de recursos sin restricción.
4. Validación de input
- Todo el input se valida en el servidor contra un schema.
- Acceso a la base con queries parametrizadas u ORM, nunca SQL armado con strings.
5. Secretos y configuración
- Ningún secreto en el cliente ni en
.envcommiteados; rotá cualquier clave expuesta. - Si usás Supabase, RLS activado en cada tabla (ver la guía de RLS).
6. Transporte y headers
- HTTPS y HSTS; CORS restringido a orígenes conocidos.
- Headers de seguridad: CSP, X-Content-Type-Options, X-Frame-Options.
Automatizá el checklist
Nurbak escanea tu repo de GitHub en busca de estos problemas, devuelve un informe priorizado y puede abrir un PR con el fix. En runtime, configurá alertas sobre la tasa de error por endpoint en tus logs o tu APM para detectar un ataque en curso.
