CalDAV: Support Basic auth; trim+validate UUID; deprecate query token via headers; ICS end time helper; docs+instructions updated
This commit is contained in:
@@ -37,17 +37,38 @@ Das System verwendet ein Rate-Limiting, um Spam und Missbrauch des Buchungsformu
|
||||
- **Zeitfenster:** 10 Minuten
|
||||
- **Verhalten:** Nach 5 Anfragen muss der Nutzer 10 Minuten warten
|
||||
|
||||
### Login (IP-basiert)
|
||||
- **Limit:** 5 fehlgeschlagene Login-Versuche pro IP-Adresse
|
||||
- **Zeitfenster:** 15 Minuten
|
||||
- **Verhalten:** Das Limit zählt nur fehlgeschlagene Versuche. Nach erfolgreichem Login wird der Zähler zurückgesetzt. Bei Überschreitung muss der Nutzer 15 Minuten warten.
|
||||
- **Zweck:** Schutz vor Brute-Force-Angriffen auf Admin-Accounts
|
||||
|
||||
### Admin-Operationen (Benutzer-basiert)
|
||||
- **Limit:** 30 Anfragen pro Admin-Benutzer
|
||||
- **Zeitfenster:** 5 Minuten
|
||||
- **Verhalten:** Nach 30 Anfragen muss der Admin 5 Minuten warten
|
||||
- **Zweck:** Verhindert versehentliches Spam durch Admin-UI (z.B. Doppelklicks, fehlerhafte Skripte)
|
||||
- **Betroffene Endpoints:** Treatments (create/update/remove), Bookings (manualCreate/updateStatus/remove), Recurring Availability (alle Schreiboperationen), Gallery (alle Schreiboperationen), Reviews (approve/reject/delete)
|
||||
|
||||
### Admin-Operationen (IP-basiert)
|
||||
- **Limit:** 50 Anfragen pro IP-Adresse
|
||||
- **Zeitfenster:** 5 Minuten
|
||||
- **Verhalten:** Nach 50 Anfragen muss 5 Minuten gewartet werden
|
||||
- **Zweck:** Zusätzlicher Schutz gegen IP-basierte Angriffe auf Admin-Endpoints
|
||||
|
||||
## Wie es funktioniert
|
||||
|
||||
Das Rate-Limiting prüft **beide** Kriterien:
|
||||
Das Rate-Limiting prüft die passenden Kriterien je Endpoint. Für Admin-Operationen werden **beide** Limits geprüft:
|
||||
1. **E-Mail-Adresse:** Verhindert, dass dieselbe Person mit derselben E-Mail zu viele Anfragen stellt
|
||||
2. **IP-Adresse:** Verhindert, dass jemand mit verschiedenen E-Mail-Adressen von derselben IP aus spammt
|
||||
3. **Benutzer-basiert (Admin):** Limitiert Anfragen je Admin-Benutzer
|
||||
4. **IP-basiert (Admin):** Limitiert Anfragen je IP zusätzlich
|
||||
|
||||
Wenn eines der Limits überschritten wird, erhält der Nutzer eine Fehlermeldung mit Angabe der Wartezeit.
|
||||
|
||||
## IP-Erkennung
|
||||
|
||||
Das System erkennt die Client-IP auch hinter Proxies und Load Balancern durch folgende Headers:
|
||||
Das System erkennt die Client-IP auch hinter Proxies und Load Balancern durch folgende Headers (unterstützt `Headers`-API und einfache Record-Objekte):
|
||||
- `x-forwarded-for`
|
||||
- `x-real-ip`
|
||||
- `cf-connecting-ip` (Cloudflare)
|
||||
@@ -60,7 +81,7 @@ Das System erkennt die Client-IP auch hinter Proxies und Load Balancern durch fo
|
||||
|
||||
## Anpassung
|
||||
|
||||
Die Limits können in `src/server/lib/rate-limiter.ts` in der Funktion `checkBookingRateLimit()` angepasst werden:
|
||||
Die Limits können in `src/server/lib/rate-limiter.ts` angepasst werden. Beispiele:
|
||||
|
||||
```typescript
|
||||
// E-Mail-Limit anpassen
|
||||
@@ -74,6 +95,23 @@ const ipConfig: RateLimitConfig = {
|
||||
maxRequests: 5, // Anzahl der Anfragen
|
||||
windowMs: 10 * 60 * 1000, // Zeitfenster in Millisekunden
|
||||
};
|
||||
|
||||
// Login-Bruteforce-Schutz
|
||||
const loginConfig: RateLimitConfig = {
|
||||
maxRequests: 5,
|
||||
windowMs: 15 * 60 * 1000,
|
||||
};
|
||||
|
||||
// Admin-Operationen
|
||||
const adminUserConfig: RateLimitConfig = {
|
||||
maxRequests: 30,
|
||||
windowMs: 5 * 60 * 1000,
|
||||
};
|
||||
|
||||
const adminIpConfig: RateLimitConfig = {
|
||||
maxRequests: 50,
|
||||
windowMs: 5 * 60 * 1000,
|
||||
};
|
||||
```
|
||||
|
||||
## Fehlermeldungen
|
||||
@@ -91,3 +129,5 @@ Für Produktionsumgebungen empfehlen sich:
|
||||
- ✅ Whitelist für vertrauenswürdige IPs (z.B. Admin-Zugang)
|
||||
- ✅ Anpassung der Limits basierend auf tatsächlichem Nutzungsverhalten
|
||||
|
||||
Siehe auch `docs/redis-migration.md` für Hinweise zur Migration auf Redis in Multi-Instance-Setups.
|
||||
|
||||
|
Reference in New Issue
Block a user