El sistema incluye medidas de seguridad y protección contra spam mediante rate limiting y validación de headers de autorización.
El sistema implementa límites de peticiones por minuto/hora para prevenir abuso:
-
Autenticación:
- Login admin: 5 peticiones/minuto
- Login estudiante: 10 peticiones/minuto
- Registro estudiante: 3 peticiones/minuto
-
Talleres:
- Listar talleres: 60 peticiones/minuto
- Ver taller específico: 30 peticiones/minuto
- Inscribirse/desinscribirse: 10 peticiones/minuto
-
Utilidades:
- Estadísticas: 20 peticiones/minuto
- Categorías: 30 peticiones/minuto
- Health check: 60 peticiones/minuto
- Endpoint raíz: 30 peticiones/minuto
-
Límite global: 100 peticiones/hora por IP
Authorization: Bearer <jwt_token>
- Token JWT válido y no expirado
- Rol apropiado (admin/estudiante)
- Validación de integridad del token
El sistema añade automáticamente headers de seguridad:
X-Content-Type-Options: nosniffX-Frame-Options: DENYX-XSS-Protection: 1; mode=blockReferrer-Policy: strict-origin-when-cross-origin
# Rate Limiting
REDIS_URL=redis://localhost:6379
RATELIMIT_DEFAULT=100 per hourEl sistema ahora incluye Redis para almacenar los contadores de rate limiting:
redis:
image: redis:7-alpine
container_name: redis
restart: always
ports:
- "6379:6379"// Ejemplo de petición autenticada
const response = await fetch('/api/workshops', {
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
}
});// Manejo de error 429 (Too Many Requests)
if (response.status === 429) {
const error = await response.json();
console.log(`Rate limit excedido. Reintentar en: ${error.reintentar_en}`);
// Implementar retry con backoff
}{
"mensaje": "Demasiadas peticiones",
"descripcion": "Has excedido el límite de peticiones permitidas",
"reintentar_en": "60 segundos"
}{
"mensaje": "Token inválido"
}{
"mensaje": "Permisos de administrador requeridos"
}