Rate Limiting em PHP: Limitação de Frequência de Requisições para Proteção do Site

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

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

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

Exemplo:

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

Recommendations