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-limiterAnwendungsbeispiel:
<?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-ratelimiterBeispiel:
<?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) Auch in der Bibliothek
Arbeiten mit Excel in Go (Golang): Bibliotheken exelize und tealeg/xlsx
Diesel für Rust: Vollständiger Leitfaden mit Beispielen
TipKit für Swift: Vollständiges Tutorial mit Beispielen
CoreBluetooth für Swift: Vollständiges BLE-Guide mit Beispielen