# 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