Globaler /api-Rate-Limit-Backstop (Pentest R148)
Es gab bislang keinen generellen Limiter - nur Login/Passwort-Reset/ Staff-ReAuth/Consent; authentifizierte Endpoints waren gegen Enumeration/ DoS ungedrosselt. Neuer apiBackstopRateLimiter auf alle /api-Requests, vor den Routern gemountet (ergaenzt die feineren Limiter, ersetzt sie nicht). Key = nur IPv6-/56-normalisierte IP - bewusst nicht IP+User, da der User- Claim hier nur unverifiziert lesbar waere (authenticate laeuft erst pro Route) und ein Angreifer sonst per Fake-userId beliebig Buckets erzeugen koennte. Limit per Env API_RATE_LIMIT_PER_MIN (Default 1200/min, Floor 60), /api/health ausgenommen. Kein SecurityEvent pro Block (Flood-Amplification). Deckt zugleich den offenen IPv6-Rate-Limit-Test ausserhalb der Auth-Pfade ab. Verifiziert: 60x200 dann 429, health bleibt 200. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -97,6 +97,23 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
|
||||
|
||||
## ✅ Erledigt
|
||||
|
||||
- [x] **🛡️ Globaler API-Rate-Limit-Backstop + BLZ-Guard-Härtung (Pentest R148)** (2026-08-12)
|
||||
- **Backstop:** Neuer genereller Limiter auf ALLE `/api`-Requests
|
||||
(`apiBackstopRateLimiter`, in `index.ts` vor den Routern). Vorher gab es
|
||||
KEINEN generellen Limiter – nur Login/Passwort-Reset/Staff-ReAuth/Consent;
|
||||
authentifizierte Endpoints waren gegen Enumeration/DoS ungedrosselt.
|
||||
Key = **nur IPv6-/56-normalisierte IP** (bewusst nicht IP+User: der
|
||||
User-Claim wäre hier nur unverifiziert lesbar → Bypass per Fake-Token).
|
||||
Limit per Env `API_RATE_LIMIT_PER_MIN` (Default **1200/min**, Floor 60),
|
||||
`/api/health` ausgenommen. Kein SecurityEvent pro Block (sonst Flood-
|
||||
Amplification). Verifiziert (60×200→429, health bleibt 200).
|
||||
- **Deckt den offenen IPv6-Test mit ab:** außerhalb der Auth-Pfade greift jetzt
|
||||
ebenfalls ein IPv6-normalisierter Limiter.
|
||||
- **BLZ-Poisoning-Guard:** prüft jetzt JEDEN Dataset-Eintrag (nicht nur die
|
||||
erste Zeile) – 8-stellige BLZ, Wert `[Name]` oder `[Name,BIC]`,
|
||||
`next.remove` = BLZ-Liste, `next.valid` = gültiges Datum. Banken **ohne BIC**
|
||||
(`[Name]`, z.B. BLZ 60050009) korrekt zugelassen → `lookupBlz` liefert `bic:''`.
|
||||
|
||||
- [x] **🔄 BLZ-/Bankdaten: Auto-Update via Volume + Einstellungen** (2026-08-12)
|
||||
- Neue Einstellungen-Seite **Einstellungen → Bankdaten (BLZ)** (`/settings/bank-data`):
|
||||
zeigt Datenstand (aktive Quelle Volume/Image, Version, Anzahl Banken,
|
||||
|
||||
Reference in New Issue
Block a user