Rate Limiting en PHP: Limitación de frecuencia de solicitudes para proteger el sitio

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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-limiter

Ejemplo 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-ratelimiter

Ejemplo:

<?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)

Recommendations