Rate Limiting en PHP: Guía completa para proteger contra sobrecargas
Rate Limiting (limitación de frecuencia de solicitudes) es un mecanismo de protección crítico para aplicaciones web. Previene el abuso de recursos del servidor, protege contra ataques DDoS, fuerza bruta de contraseñas y spam. En PHP existen varios enfoques y bibliotecas efectivos para implementar rate limiting. En este artículo, exploraremos las mejores herramientas, principios de funcionamiento y ejemplos prácticos.
¿Qué es Rate Limiting y por qué es necesario?
Rate Limiting establece el número máximo de solicitudes que un cliente (dirección IP, usuario o clave API) puede realizar en un período de tiempo determinado. Objetivos principales:
- Protección contra DDoS — prevención de sobrecarga del servidor por bots
- Prevención de fuerza bruta — limitación de intentos de inicio de sesión
- Distribución justa de recursos — acceso equitativo para todos los usuarios
- Ahorro de recursos del servidor — reducción de carga en la base de datos y el procesador
Algoritmos populares de Rate Limiting
Antes de elegir una biblioteca, es importante entender los algoritmos principales:
- Token Bucket (Cubo de fichas) — acumula tokens a una velocidad determinada, permite ráfagas temporales de tráfico
- Leaky Bucket (Cubo con fugas) — suaviza el tráfico procesando solicitudes a una velocidad constante
- Fixed Window (Ventana fija) — cuenta solicitudes en un intervalo de tiempo fijo
- Sliding Window (Ventana deslizante) — versión más precisa que considera solicitudes en una ventana de tiempo deslizante
Mejores bibliotecas para Rate Limiting en PHP
1. Symfony Rate Limiter
Componente oficial de Symfony que se puede usar independientemente del framework. Soporta Redis, APCu y almacenamiento en archivos.
composer require symfony/rate-limiterEjemplo de uso:
<?phpuse Symfony\\Component\\RateLimiter\\RateLimiterFactory;use Symfony\\Component\\RateLimiter\\Storage\\InMemoryStorage;
$factory = new RateLimiterFactory([ 'id' => 'login', 'policy' => 'token_bucket', 'limit' => 10, 'rate' => ['interval' => '1 minute'],], new InMemoryStorage());
$limiter = $factory->create('user_123');
if ($limiter->consume()->isAccepted()) { // Permitir solicitud echo "Acceso permitido";} else { // Rechazar solicitud http_response_code(429); echo "Demasiadas solicitudes";}?>2. PHP RateLimiter (por bantu)
Biblioteca ligera para escenarios simples. Soporta Redis, Memcached y archivos.
composer require bantu/php-ratelimiterEjemplo:
<?phpuse bantu\\RateLimiter\\RateLimiterFactory;
$factory = new RateLimiterFactory();$limiter = $factory->createRedisRateLimiter( new \\Predis\\Client(), 'api_limit', 100, // límite de solicitudes 3600 // ventana en segundos);
if ($limiter->hit($_SERVER['REMOTE_ADDR'])) { echo "Solicitud aceptada";} else { http_response_code(429); echo "Límite agotado";}?>3. GrahamCampbell/Laravel RateLimiter
Si trabajas con Laravel, esta es la solución nativa. Integrada en el framework desde la versión 8.
<?phpuse Illuminate\\Support\\Facades\\RateLimiter;
// Definición del limitador en AppServiceProviderRateLimiter::for('api', function ($job) { return \\Illuminate\\Cache\\RateLimiting\\Limit::perMinute(60)->by($job->user->id ?: $job->ip());});
// Uso en el controladorpublic function store(Request $request){ if (RateLimiter::tooManyAttempts('send-message:'.$request->ip(), 5)) { return response('Demasiados mensajes', 429) También en la biblioteca
Registro en Go: Resumen de la biblioteca estándar log y alternativas
Trabajo con S3 y almacenamiento en la nube en Swift (iOS/macOS): librería AWSS3
Monitoreo de aplicaciones Java: herramientas y mejores prácticas
Análisis de HTML en Kotlin: jsoup, ktor, khtml y otras herramientas