#Sicherheit
#Passkey/WebAuthn (Gallery)
- Einmal-Passwort-Registrierung (
S3G_REGISTRATION_OTP Umgebungsvariable)
- Attestation-Verifizierung via lbuchs/webauthn
- Counter-Validierung bei Authentifizierung (Schutz gegen geklonte Authenticators)
- Transports als JSON gespeichert
#Session-Management
secure — HTTPS-only in Produktion (konfigurierbar via APP_SECURE_COOKIES)
httponly — Kein JavaScript-Zugriff
samesite=Lax — CSRF-Mitigation
session_regenerate_id(true) bei Login/Logout
#CSRF-Schutz
- Tokens per Session:
bin2hex(random_bytes(32))
- Timing-sichere Validierung via
hash_equals()
- Pflicht für: Login, Logout, Upload, Löschen, Galerie-Erstellung
HTTP-Headers (Nginx)
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=()
Content-Security-Policy: default-src 'self'; script-src/style-src 'unsafe-inline'
#Gallery-FotoBattle-Integration
- HMAC-SHA256-Tokens für die Submit/Withdraw-API
- Shared Secret (
BATTLE_SUBMIT_SECRET) zwischen beiden Containern
- Timing-sichere Validierung via
hash_equals()
#FotoBattle-spezifisch
- Passwort-Hashing mit bcrypt
- Rate Limiting: 5 fehlgeschlagene Logins → 15 Min Sperre per IP-Hash
- Optimistic Locking im Event Store (Versionskonflikte)
#Eingabevalidierung
- MIME-Type-Prüfung (nur image/jpeg, image/png, image/webp)
- Dateiendungs-Whitelist
- Date-Format-Validierung (Event-Galerien)
- Directory-Traversal-Schutz (
basename/Path-Normalisierung)
#S3-Sicherheit
- Credentials ausschließlich über Umgebungsvariablen
- Bild-Proxy: Client greift nie direkt auf RustFS zu
- ETag-Headers für Client-seitiges Caching