RATE_LIMITING.md 1.9 KB

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.