Rate Limiting em PHP: Guia Completo para Proteção contra Sobrecargas
Rate Limiting (limitação de frequência de requisições) é um mecanismo de proteção criticamente importante para aplicações web. Ele previne o abuso de recursos do servidor, protege contra ataques DDoS, brute force de senhas e spam. Em PHP, existem várias abordagens e bibliotecas eficientes para implementar rate limiting. Neste artigo, vamos explorar as melhores ferramentas, princípios de funcionamento e exemplos práticos.
O que é Rate Limiting e por que é necessário?
Rate Limiting estabelece o número máximo de requisições que um cliente (endereço IP, usuário ou chave de API) pode realizar em um determinado período de tempo. Principais objetivos:
- Proteção contra DDoS — prevenção de sobrecarga do servidor por bots
- Prevenção de brute force — limitação de tentativas de login no sistema
- Distribuição justa de recursos — acesso igualitário para todos os usuários
- Economia de recursos do servidor — redução da carga no banco de dados e processador
Algoritmos populares de Rate Limiting
Antes de escolher uma biblioteca, é importante entender os principais algoritmos:
- Token Bucket (Balde de Tokens) — acumula tokens a uma taxa específica, permitindo picos temporários de tráfego
- Leaky Bucket (Balde Furado) — suaviza o tráfego, processando requisições a uma taxa constante
- Fixed Window (Janela Fixa) — conta requisições em um intervalo de tempo fixo
- Sliding Window (Janela Deslizante) — versão mais precisa, considerando requisições em uma janela de tempo deslizante
Melhores bibliotecas para Rate Limiting em PHP
1. Symfony Rate Limiter
Componente oficial do Symfony que pode ser usado independentemente do framework. Suporta Redis, APCu e armazenamento em arquivo.
composer require symfony/rate-limiterExemplo 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 requisição echo "Acesso permitido";} else { // Rejeitar requisição http_response_code(429); echo "Muitas requisições";}?>2. PHP RateLimiter (by bantu)
Biblioteca leve para cenários simples. Suporta Redis, Memcached e arquivos.
composer require bantu/php-ratelimiterExemplo:
<?phpuse bantu\\RateLimiter\\RateLimiterFactory;
$factory = new RateLimiterFactory();$limiter = $factory->createRedisRateLimiter( new \\Predis\\Client(), 'api_limit', 100, // limite de requisições 3600 // janela em segundos);
if ($limiter->hit($_SERVER['REMOTE_ADDR'])) { echo "Requisição aceita";} else { http_response_code(429); echo "Limite excedido";}?>3. GrahamCampbell/Laravel RateLimiter
Se você trabalha com Laravel, esta é a solução nativa. Integrada ao framework desde a versão 8.
<?phpuse Illuminate\\Support\\Facades\\RateLimiter;
// Definição do limitador no AppServiceProviderRateLimiter::for('api', function ($job) { return \\Illuminate\\Cache\\RateLimiting\\Limit::perMinute(60)->by($job->user->id ?: $job->ip());});
// Uso no controllerpublic function store(Request $request){ if (RateLimiter::tooManyAttempts('send-message:'.$request->ip(), 5)) { return response('Muitas mensagens', 429) Também na biblioteca
Criptografia em TypeScript: criptografia e hashes na prática
Trabalhando com Kafka em Kotlin: bibliotecas, configuração e exemplos
Filas de Tarefas em Go (Golang): Melhores Bibliotecas e Ferramentas
Biblioteca WebSocket Ratchet para PHP: criando tempo real no site
Filas de tarefas em Node.js: Bull, Bee-Queue, Kue e implementação em Redis