# Sicherheitsbericht — Ban Yaro

_Erstellt: 01.05.2026 06:07_


---


## Übersicht implementierter Schutzmaßnahmen


### 1. Authentifizierung & Passwörter

- **JWT** (HS256) mit 30-Tage-Ablauf, HttpOnly + Secure + SameSite=lax Cookie
- **Bcrypt**-Passwort-Hashing mit automatischem Salt
- Mindestlänge 8 Zeichen, serverseitig erzwungen
- Passwort-Reset: kryptographisches Token, 2 Stunden Ablauf


### 2. Registrierung

- **E-Mail-Verifikation** zwingend vor dem ersten Login
- Verifikationslink läuft nach 7 Tagen ab
- Rate Limit: 5 Registrierungen / Stunde / IP
- Username-Blocklist: >200 reservierte und unangemessene Begriffe
- Keine Doppelanmeldung (E-Mail und Username unique)


### 3. Login-Schutz

- **IP-Rate-Limit**: 10 Versuche / 5 Minuten
- **Email-Rate-Limit**: 5 Versuche / 5 Minuten pro E-Mail-Adresse
- **Account-Lockout**: 5 Fehlversuche → 15 Minuten gesperrt (in-memory)
- Fehlerzähler wird bei erfolgreichem Login zurückgesetzt
- Gleiche Fehlermeldung bei falschem Passwort UND unbekannter E-Mail (kein User-Enumeration)


### 4. Forum-Schutz

- E-Mail-Verifikation Pflicht zum Posten
- **Post-Cooldown**: 30 Sekunden zwischen beliebigen Beiträgen
- **Stunden-Limit Threads**: max. 5 neue Threads / Stunde / User
- **Stunden-Limit Antworten**: max. 20 Antworten / Stunde / User
- **Duplikat-Erkennung**: gleicher Text in 5 Minuten → blockiert
- **Content-Filter**: Spam-Keywords, URL-Sperre für Accounts < 7 Tage, Sonderzeichen-Ratio
- Moderatoren können Threads sperren, Beiträge löschen (Soft-Delete)
- Report-System: User können Beiträge melden


### 5. HTTP-Security-Headers

| Header | Wert |
|--------|------|
| `Strict-Transport-Security` | `max-age=31536000; includeSubDomains` |
| `Content-Security-Policy` | default-src 'self'; frame-ancestors 'none'; … |
| `X-Content-Type-Options` | `nosniff` |
| `Referrer-Policy` | `strict-origin-when-cross-origin` |
| `Permissions-Policy` | camera=(), microphone=(), geolocation=(self) |


### 6. Rate Limiting (alle Endpunkte)

| Endpunkt                  | Limit  | Fenster        |
| ------------------------- | ------ | -------------- |
| /auth/register            | 5 Req  | 60 Min         |
| /auth/login (IP)          | 10 Req | 5 Min          |
| /auth/login (Email)       | 5 Req  | 5 Min          |
| /auth/forgot-password     | 3 Req  | 60 Min         |
| /auth/resend-verification | 3 Req  | 60 Min / Email |
| /auth/reset-password      | 5 Req  | 60 Min         |
| KI-Features               | 10 Req | 60 Min         |
| Poison-Reports            | 3 Req  | 60 Min         |
| Wiki-Liste                | 60 Req | 60 Sek         |
| Wiki-Detail               | 30 Req | 60 Sek         |


### 7. Honeypot-Fallen

Folgende Pfade blockieren Scanner-IPs sofort für 24 Stunden:

```
/api/admin/users  /api/v1/users  /api/users  /api/.env
/api/config  /api/setup  /api/install  /api/phpinfo
/api/debug  /api/actuator  /api/swagger  /api/graphql
/api/wiki/trap
```


### 8. Datei-Upload-Sicherheit

- **Magic-Byte-Prüfung**: JPEG, PNG, GIF, WebP, MP4, WebM
- **Path-Traversal-Schutz**: alle Pfade bleiben innerhalb `MEDIA_DIR`
- **Größenbeschränkung**: 20 MB globales Limit (Middleware)
- Automatische Konvertierung: HEIC→JPEG, MOV/AVI→MP4
- Max. 5 Fotos pro Forum-Thread


### 9. Admin & Moderation

- Admin-Endpoints per `require_admin` Dependency geschützt
- Moderatoren-Rolle mit eingeschränkten Rechten
- User-Banning mit Sperrgrund, geprüft bei jedem Request
- Outreach-Mailing nur über Admin-Panel, vollständiges Log


## Aktuelle Kennzahlen

| Metrik                   | Wert |
| ------------------------ | ---- |
| Gesperrte Accounts       | 0    |
| Unverifizierte Accounts  | 4    |
| Gesendete Outreach-Mails | 9    |


## Bekannte Einschränkungen

- Rate-Limit-Daten und IP-Blocklist sind **in-memory** → Reset bei Container-Neustart
- Kein CAPTCHA (bewusst: Nutzerfreundlichkeit vs. Bot-Schutz)
- Keine Refresh-Token-Rotation (JWT ist 30 Tage gültig)
- Analytics (Besucher) extern über Umami — kein Zugriff aus dem Container


## Empfehlungen für nächste Überprüfung

- [ ] Prüfen ob IP-Blocklist-Persistenz via DB sinnvoll wäre
- [ ] CSP weiter verschärfen (nonce-basiert statt unsafe-inline)
- [ ] Login-Logs in DB schreiben (für Audit-Trail)
- [ ] Zwei-Faktor-Authentifizierung für Admin-Accounts evaluieren
