Las APIs REST son la columna vertebral de las aplicaciones modernas. También son uno de los vectores de ataque más comunes. Veamos las vulnerabilidades más críticas que encontramos en nuestras auditorías.

1. Autenticación Débil o Inexistente

El error más común que vemos: endpoints que deberían requerir autenticación pero son accesibles sin token.

Checklist de autenticación en APIs

  • ¿Todos los endpoints sensibles requieren autenticación?
  • ¿Los tokens JWT tienen tiempo de expiración razonable?
  • ¿Se valida la firma del JWT en cada request?
  • ¿Se usa RS256 o HS256 con clave robusta?
  • ¿Hay protección contra fuerza bruta en el endpoint de login?

2. Autorización Incorrecta (IDOR)

Insecure Direct Object References (IDOR) es cuando un usuario puede acceder a recursos de otro usuario simplemente cambiando un ID en la URL.

GET /api/orders/1234 HTTP/1.1
Authorization: Bearer <token_usuario_A>

Si el usuario A puede ver la orden 1234 del usuario B cambiando el ID, tenemos un IDOR.

Solución

Siempre verificar que el recurso solicitado pertenezca al usuario autenticado:

const order = await db.orders.findById(req.params.id);
if (order.userId !== req.user.id) {
  return res.status(403).json({ error: 'No autorizado' });
}

3. Rate Limiting Ausente

Sin rate limiting, tu API es vulnerable a:

  • Fuerza bruta en login
  • Enumeración de usuarios
  • Denegación de servicio (DoS)
  • Web scraping masivo

Implementación básica

const rateLimit = require('express-rate-limit');

const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 minutos
  max: 100, // máximo 100 requests por IP
  standardHeaders: true,
  legacyHeaders: false,
});

app.use('/api/', limiter);

4. Exposición de Datos en Respuestas

Uno de los hallazgos más frecuentes: las APIs devuelven más datos de los necesarios, incluyendo contraseñas hasheadas, tokens internos, IDs de base de datos o información de infraestructura.

Solución

Definir explícitamente qué campos se devuelven en cada endpoint. Nunca confiar en “filtrar después”. Usar DTOs (Data Transfer Objects) o serializers que definan la respuesta exacta.


La seguridad de APIs no es un feature adicional: es parte fundamental del diseño. Incorporá estas validaciones desde el día uno.