Commit Graph

1 Commits

Author SHA1 Message Date
vk
058612dbe6 [P1 Security] Session Security Hardening – Encryption & Secure Cookies (vibe-kanban 48c2078b)
## Security Audit: Session-Konfiguration härten

### Problem
Die aktuelle `.env.example` hat unsichere Session-Defaults:

```env
SESSION_ENCRYPT=false      # Session-Daten unverschlüsselt in der DB
SESSION_SECURE_COOKIE=     # Nicht gesetzt – Cookie wird auch über HTTP gesendet
SESSION_DOMAIN=null         # Nicht eingeschränkt
```

Da die App eine Custom Nostr-basierte Auth verwendet (`app/Auth/NostrSessionGuard.php`) und der `pubkey` in der Session gespeichert wird, ist die Session ein attraktives Angriffsziel. Unverschlüsselte Sessions in der Datenbank bedeuten, dass ein DB-Leak sofort alle aktiven Sessions kompromittiert.

### Lösung

**1. `.env.example` aktualisieren:**

```env
SESSION_ENCRYPT=true
SESSION_SECURE_COOKIE=true
```

**2. Session-Config in `config/session.php` prüfen:**

Falls `config/session.php` nicht existiert (Laravel 12 Slim-Struktur), muss die Config ggf. mit `php artisan config:publish session` veröffentlicht werden. Prüfe ob die folgenden Werte korrekt gesetzt sind:

```php
'encrypt' => env('SESSION_ENCRYPT', true),        // Default auf true ändern
'secure' => env('SESSION_SECURE_COOKIE', true),    // Default auf true ändern
'http_only' => true,                                // Bereits Standard
'same_site' => 'lax',                               // Bereits Standard
```

**3. Cookie-Sicherheit:**
- `http_only` verhindert JavaScript-Zugriff auf Session-Cookies (Schutz gegen XSS-Cookie-Theft)
- `secure` erzwingt HTTPS-only Übertragung
- `same_site: lax` schützt gegen CSRF bei Top-Level-Navigation

### Betroffene Dateien
- `.env.example` – Default-Werte aktualisieren
- `config/session.php` – Falls vorhanden, Defaults härten. Falls nicht vorhanden, mit `php artisan config:publish session` erstellen und anpassen

### Vorgehen
1. Prüfe ob `config/session.php` existiert (bei Laravel 12 ist es möglicherweise nicht veröffentlicht)
2. Falls nicht vorhanden: `php artisan config:publish session --no-interaction`
3. Sichere Defaults setzen (encrypt=true, secure=true)
4. `.env.example` aktualisieren
5. Einen Pest-Test schreiben, der verifiziert dass Session-Cookies die korrekten Flags haben (secure, httpOnly, sameSite)
6. `vendor/bin/pint --dirty` und `php artisan test --compact`

### Hinweis
- In der lokalen Entwicklung (`APP_ENV=local`) kann `SESSION_SECURE_COOKIE=false` gesetzt werden, damit HTTP funktioniert
- Der Default in der Config sollte aber `true` sein, damit Produktion abgesichert ist
- Die `.env` Datei selbst wird NICHT bearbeitet (nur `.env.example`)

### Akzeptanzkriterien
- `SESSION_ENCRYPT=true` als Default in `.env.example`
- `SESSION_SECURE_COOKIE=true` als Default in `.env.example`
- Session-Config verwendet sichere Defaults
- Tests verifizieren Cookie-Sicherheitsflags
- Lokale Entwicklung bleibt funktional (über `.env` Override)
2026-02-11 23:19:31 +01:00