Rate Limiting in PHP: Begrenzung der Anfragehäufigkeit zum Schutz der Website

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Rate Limiting in PHP: Vollständige Anleitung zum Schutz vor Überlastungen



Rate Limiting (Begrenzung der Anfragehäufigkeit) ist ein kritisch wichtiger Mechanismus zum Schutz von Webanwendungen. Er verhindert den Missbrauch von Serverressourcen, schützt vor DDoS-Angriffen, Brute-Force-Passwortangriffen und Spam. In PHP gibt es mehrere effektive Ansätze und Bibliotheken zur Implementierung von Rate Limiting. In diesem Artikel betrachten wir die besten Werkzeuge, Funktionsprinzipien und praktische Beispiele.



Was ist Rate Limiting und warum wird es benötigt?

Rate Limiting legt die maximale Anzahl von Anfragen fest, die ein Client (IP-Adresse, Benutzer oder API-Schlüssel) innerhalb eines bestimmten Zeitraums ausführen kann. Hauptziele:

  • Schutz vor DDoS — Verhinderung der Serverüberlastung durch Bots
  • Verhinderung von Brute-Force — Begrenzung der Anmeldeversuche
  • Faire Ressourcenverteilung — gleicher Zugang für alle Benutzer
  • Einsparung von Serverressourcen — Reduzierung der Last auf Datenbank und Prozessor


Beliebte Rate-Limiting-Algorithmen

Vor der Auswahl einer Bibliothek ist es wichtig, die grundlegenden Algorithmen zu verstehen:

  • Token Bucket — sammelt Tokens mit einer bestimmten Rate, ermöglicht kurzfristige Verkehrsspitzen
  • Leaky Bucket — glättet den Verkehr, verarbeitet Anfragen mit konstanter Geschwindigkeit
  • Fixed Window — zählt Anfragen in einem festen Zeitintervall
  • Sliding Window — eine genauere Variante, die Anfragen in einem gleitenden Zeitfenster berücksichtigt


Beste Bibliotheken für Rate Limiting in PHP



1. Symfony Rate Limiter

Offizielle Symfony-Komponente, die unabhängig vom Framework verwendet werden kann. Unterstützt Redis, APCu und Dateispeicher.

composer require symfony/rate-limiter

Anwendungsbeispiel:

<?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()) { // Anfrage erlauben echo "Zugriff erlaubt";} else { // Anfrage ablehnen http_response_code(429); echo "Zu viele Anfragen";}?>


2. PHP RateLimiter (by bantu)

Leichtgewichtige Bibliothek für einfache Szenarien. Unterstützt Redis, Memcached und Dateien.

composer require bantu/php-ratelimiter

Beispiel:

<?phpuse bantu\\RateLimiter\\RateLimiterFactory;

$factory = new RateLimiterFactory();$limiter = $factory->createRedisRateLimiter( new \\Predis\\Client(), 'api_limit', 100, // Anfragelimit 3600 // Fenster in Sekunden);

if ($limiter->hit($_SERVER['REMOTE_ADDR'])) { echo "Anfrage angenommen";} else { http_response_code(429); echo "Limit erschöpft";}?>


3. GrahamCampbell/Laravel RateLimiter

Wenn Sie mit Laravel arbeiten, ist dies die native Lösung. Ab Version 8 im Framework integriert.

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

// Definition des Limiters in AppServiceProviderRateLimiter::for('api', function ($job) { return \\Illuminate\\Cache\\RateLimiting\\Limit::perMinute(60)->by($job->user->id ?: $job->ip());});

// Verwendung im Controllerpublic function store(Request $request){ if (RateLimiter::tooManyAttempts('send-message:'.$request->ip(), 5)) { return response('Zu viele Nachrichten', 429)

Empfehlungen