|
@@ -0,0 +1,61 @@
|
|
|
|
|
+# Rate Limiting
|
|
|
|
|
+
|
|
|
|
|
+## Zweck
|
|
|
|
|
+
|
|
|
|
|
+Schützt die API gegen Spam, Bot-Traffic und Missbrauch durch zu viele Anfragen in kurzer Zeit.
|
|
|
|
|
+
|
|
|
|
|
+## Implementierung
|
|
|
|
|
+
|
|
|
|
|
+- Klasse: `src/Security/RateLimiter.php`
|
|
|
|
|
+- Strategie: Sliding-Window auf Basis von Zeitstempeln
|
|
|
|
|
+- Persistenz: Flat Files in `storage/rate_limit/`
|
|
|
|
|
+- Schlüsselablage: pro Key wird `sha256(key).json` verwendet
|
|
|
|
|
+- Sperren: `flock(LOCK_EX)` je Key-Datei
|
|
|
|
|
+
|
|
|
|
|
+## Konfiguration
|
|
|
|
|
+
|
|
|
|
|
+In `config/app.php`:
|
|
|
|
|
+
|
|
|
|
|
+- `rate_limit.requests`
|
|
|
|
|
+Maximal erlaubte Requests pro Zeitfenster
|
|
|
|
|
+- `rate_limit.window_seconds`
|
|
|
|
|
+Länge des Zeitfensters in Sekunden
|
|
|
|
|
+
|
|
|
|
|
+Default:
|
|
|
|
|
+
|
|
|
|
|
+- `requests = 30`
|
|
|
|
|
+- `window_seconds = 300` (5 Minuten)
|
|
|
|
|
+
|
|
|
|
|
+## Aktuell geschützte Endpunkte
|
|
|
|
|
+
|
|
|
|
|
+- `POST /api/load-draft.php`
|
|
|
|
|
+ - Key: `load:{ip}:{email}`
|
|
|
|
|
+- `POST /api/save-draft.php`
|
|
|
|
|
+ - Key: `save:{ip}:{email}`
|
|
|
|
|
+- `POST /api/submit.php`
|
|
|
|
|
+ - Key: `submit:{ip}:{email}`
|
|
|
|
|
+
|
|
|
|
|
+Hinweis: Jeder Endpunkt hat einen eigenen Prefix (`load/save/submit`) und damit ein separates Limit-Fenster.
|
|
|
|
|
+
|
|
|
|
|
+## Verhalten bei Limitüberschreitung
|
|
|
|
|
+
|
|
|
|
|
+API antwortet mit HTTP `429` und einer Fehlermeldung (z. B. „Zu viele Anfragen“).
|
|
|
|
|
+
|
|
|
|
|
+## Betriebsaspekte
|
|
|
|
|
+
|
|
|
|
|
+- Viele Dateien in `storage/rate_limit/` sind normal.
|
|
|
|
|
+- Verzeichnis muss für den Webserver beschreibbar sein.
|
|
|
|
|
+- Löschen einzelner Dateien setzt das Limit für den betreffenden Key zurück.
|
|
|
|
|
+- Komplettes Leeren des Ordners setzt alle Limits zurück.
|
|
|
|
|
+
|
|
|
|
|
+## Tuning-Empfehlungen
|
|
|
|
|
+
|
|
|
|
|
+- Höherer Schutz: `requests` senken oder `window_seconds` erhöhen.
|
|
|
|
|
+- Weniger strenger Schutz: `requests` erhöhen oder `window_seconds` senken.
|
|
|
|
|
+- Bei aggressiven Bot-Wellen zuerst `submit` härter setzen (ggf. zukünftig endpoint-spezifische Limits einführen).
|
|
|
|
|
+
|
|
|
|
|
+## Bekannte Eigenschaften
|
|
|
|
|
+
|
|
|
|
|
+- Bei Dateisystemproblemen (Datei kann nicht geöffnet/gesperrt werden) erlaubt der Limiter aktuell die Anfrage (fail-open), um legitime Nutzer nicht zu blockieren.
|
|
|
|
|
+- NAT/Shared-IP kann mehrere legitime Nutzer unter derselben IP bündeln; durch Kombination mit E-Mail ist das Risiko reduziert.
|
|
|
|
|
+
|