Rate Limiting en PHP : Limitation du taux de requêtes pour protéger le site

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Rate Limiting en PHP : Guide complet de protection contre les surcharges



Le Rate Limiting (limitation du taux de requêtes) est un mécanisme de protection essentiel pour les applications web. Il empêche l'abus des ressources du serveur, protège contre les attaques DDoS, le brute force de mots de passe et le spam. En PHP, il existe plusieurs approches et bibliothèques efficaces pour implémenter le rate limiting. Dans cet article, nous examinerons les meilleurs outils, les principes de fonctionnement et des exemples pratiques.



Qu'est-ce que le Rate Limiting et pourquoi en a-t-on besoin ?

Le Rate Limiting établit le nombre maximum de requêtes qu'un client (adresse IP, utilisateur ou clé API) peut effectuer dans un intervalle de temps donné. Objectifs principaux :

  • Protection contre DDoS — empêche la surcharge du serveur par des bots
  • Prévention du brute force — limite les tentatives de connexion au système
  • Répartition équitable des ressources — accès égal pour tous les utilisateurs
  • Économie des ressources serveur — réduit la charge sur la base de données et le processeur


Algorithmes populaires de Rate Limiting

Avant de choisir une bibliothèque, il est important de comprendre les algorithmes de base :

  • Token Bucket (Seau à jetons) — accumule des jetons à une vitesse définie, permet des pics de trafic temporaires
  • Leaky Bucket (Seau percé) — lisse le trafic en traitant les requêtes à une vitesse constante
  • Fixed Window (Fenêtre fixe) — compte les requêtes dans un intervalle de temps fixe
  • Sliding Window (Fenêtre glissante) — version plus précise, prenant en compte les requêtes dans une fenêtre temporelle glissante


Meilleures bibliothèques pour le Rate Limiting en PHP



1. Symfony Rate Limiter

Composant officiel de Symfony, utilisable indépendamment du framework. Prend en charge Redis, APCu et le stockage par fichiers.

composer require symfony/rate-limiter

Exemple d'utilisation :

<?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()) { // Autoriser la requête echo "Accès autorisé";} else { // Rejeter la requête http_response_code(429); echo "Trop de requêtes";}?>


2. PHP RateLimiter (par bantu)

Bibliothèque légère pour les scénarios simples. Prend en charge Redis, Memcached et les fichiers.

composer require bantu/php-ratelimiter

Exemple :

<?phpuse bantu\\RateLimiter\\RateLimiterFactory;

$factory = new RateLimiterFactory();$limiter = $factory->createRedisRateLimiter( new \\Predis\\Client(), 'api_limit', 100, // limite de requêtes 3600 // fenêtre en secondes);

if ($limiter->hit($_SERVER['REMOTE_ADDR'])) { echo "Requête acceptée";} else { http_response_code(429); echo "Limite atteinte";}?>


3. GrahamCampbell/Laravel RateLimiter

Si vous travaillez avec Laravel, c'est la solution native. Intégré au framework depuis la version 8.

<?phpuse Illuminate\\Support\\Facades\\RateLimiter;

// Définition du limiteur dans AppServiceProviderRateLimiter::for('api', function ($job) { return \\Illuminate\\Cache\\RateLimiting\\Limit::perMinute(60)->by($job->user->id ?: $job->ip());});

// Utilisation dans le contrôleurpublic function store(Request $request){ if (RateLimiter::tooManyAttempts('send-message:'.$request->ip(), 5)) { return response('Trop de messages', 429)

Recommendations