/** * Rate Limiting Middleware * Protege endpoints contra abuso y ataques de fuerza bruta */ import rateLimit, { RateLimitRequestHandler } from 'express-rate-limit'; /** * Rate limiter general para toda la API * 100 requests por 15 minutos por IP */ export const generalLimiter: RateLimitRequestHandler = rateLimit({ windowMs: 15 * 60 * 1000, // 15 minutos max: 100, // 100 requests por IP message: { error: 'Demasiadas peticiones desde esta IP, intenta en 15 minutos', retryAfter: 900, // segundos }, standardHeaders: true, // Retorna rate limit info en headers `RateLimit-*` legacyHeaders: false, // No usa `X-RateLimit-*` headers skip: (req) => { // Saltar rate limiting para health checks return req.path === '/health'; }, }); /** * Rate limiter estricto para endpoints de autenticación * 5 intentos por 15 minutos por IP * Previene ataques de fuerza bruta */ export const authLimiter: RateLimitRequestHandler = rateLimit({ windowMs: 15 * 60 * 1000, // 15 minutos max: 5, // Solo 5 intentos de login por IP message: { error: 'Demasiados intentos de login, intenta en 15 minutos', retryAfter: 900, }, standardHeaders: true, legacyHeaders: false, skipSuccessfulRequests: true, // No contar requests exitosos skipFailedRequests: false, // Contar solo los fallidos }); /** * Rate limiter medio para creación de contenido * 20 creaciones por hora por IP */ export const contentWriteLimiter: RateLimitRequestHandler = rateLimit({ windowMs: 60 * 60 * 1000, // 1 hora max: 20, // 20 creaciones por hora message: { error: 'Límite de creación de contenido alcanzado, intenta en 1 hora', retryAfter: 3600, }, standardHeaders: true, legacyHeaders: false, }); /** * Rate limiter para endpoints de validación * 50 validaciones por hora por IP */ export const validationLimiter: RateLimitRequestHandler = rateLimit({ windowMs: 60 * 60 * 1000, // 1 hora max: 50, // 50 validaciones por hora message: { error: 'Límite de validaciones alcanzado, intenta en 1 hora', retryAfter: 3600, }, standardHeaders: true, legacyHeaders: false, });