mirror of
https://github.com/HolgerHatGarKeineNode/einundzwanzig-nostr.git
synced 2026-02-15 03:23:17 +00:00
## 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)
218 lines
7.7 KiB
PHP
218 lines
7.7 KiB
PHP
<?php
|
|
|
|
use Illuminate\Support\Str;
|
|
|
|
return [
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Default Session Driver
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| This option determines the default session driver that is utilized for
|
|
| incoming requests. Laravel supports a variety of storage options to
|
|
| persist session data. Database storage is a great default choice.
|
|
|
|
|
| Supported: "file", "cookie", "database", "apc",
|
|
| "memcached", "redis", "dynamodb", "array"
|
|
|
|
|
*/
|
|
|
|
'driver' => env('SESSION_DRIVER', 'database'),
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Session Lifetime
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| Here you may specify the number of minutes that you wish the session
|
|
| to be allowed to remain idle before it expires. If you want them
|
|
| to expire immediately when the browser is closed then you may
|
|
| indicate that via the expire_on_close configuration option.
|
|
|
|
|
*/
|
|
|
|
'lifetime' => env('SESSION_LIFETIME', 120),
|
|
|
|
'expire_on_close' => env('SESSION_EXPIRE_ON_CLOSE', false),
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Session Encryption
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| This option allows you to easily specify that all of your session data
|
|
| should be encrypted before it's stored. All encryption is performed
|
|
| automatically by Laravel and you may use the session like normal.
|
|
|
|
|
*/
|
|
|
|
'encrypt' => env('SESSION_ENCRYPT', true),
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Session File Location
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| When utilizing the "file" session driver, the session files are placed
|
|
| on disk. The default storage location is defined here; however, you
|
|
| are free to provide another location where they should be stored.
|
|
|
|
|
*/
|
|
|
|
'files' => storage_path('framework/sessions'),
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Session Database Connection
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| When using the "database" or "redis" session drivers, you may specify a
|
|
| connection that should be used to manage these sessions. This should
|
|
| correspond to a connection in your database configuration options.
|
|
|
|
|
*/
|
|
|
|
'connection' => env('SESSION_CONNECTION'),
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Session Database Table
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| When using the "database" session driver, you may specify the table to
|
|
| be used to store sessions. Of course, a sensible default is defined
|
|
| for you; however, you're welcome to change this to another table.
|
|
|
|
|
*/
|
|
|
|
'table' => env('SESSION_TABLE', 'sessions'),
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Session Cache Store
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| When using one of the framework's cache driven session backends, you may
|
|
| define the cache store which should be used to store the session data
|
|
| between requests. This must match one of your defined cache stores.
|
|
|
|
|
| Affects: "apc", "dynamodb", "memcached", "redis"
|
|
|
|
|
*/
|
|
|
|
'store' => env('SESSION_STORE'),
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Session Sweeping Lottery
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| Some session drivers must manually sweep their storage location to get
|
|
| rid of old sessions from storage. Here are the chances that it will
|
|
| happen on a given request. By default, the odds are 2 out of 100.
|
|
|
|
|
*/
|
|
|
|
'lottery' => [2, 100],
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Session Cookie Name
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| Here you may change the name of the session cookie that is created by
|
|
| the framework. Typically, you should not need to change this value
|
|
| since doing so does not grant a meaningful security improvement.
|
|
|
|
|
*/
|
|
|
|
'cookie' => env(
|
|
'SESSION_COOKIE',
|
|
Str::slug(env('APP_NAME', 'laravel'), '_').'_session'
|
|
),
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Session Cookie Path
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| The session cookie path determines the path for which the cookie will
|
|
| be regarded as available. Typically, this will be the root path of
|
|
| your application, but you're free to change this when necessary.
|
|
|
|
|
*/
|
|
|
|
'path' => env('SESSION_PATH', '/'),
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Session Cookie Domain
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| This value determines the domain and subdomains the session cookie is
|
|
| available to. By default, the cookie will be available to the root
|
|
| domain and all subdomains. Typically, this shouldn't be changed.
|
|
|
|
|
*/
|
|
|
|
'domain' => env('SESSION_DOMAIN'),
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| HTTPS Only Cookies
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| By setting this option to true, session cookies will only be sent back
|
|
| to the server if the browser has a HTTPS connection. This will keep
|
|
| the cookie from being sent to you when it can't be done securely.
|
|
|
|
|
*/
|
|
|
|
'secure' => env('SESSION_SECURE_COOKIE', true),
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| HTTP Access Only
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| Setting this value to true will prevent JavaScript from accessing the
|
|
| value of the cookie and the cookie will only be accessible through
|
|
| the HTTP protocol. It's unlikely you should disable this option.
|
|
|
|
|
*/
|
|
|
|
'http_only' => env('SESSION_HTTP_ONLY', true),
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Same-Site Cookies
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| This option determines how your cookies behave when cross-site requests
|
|
| take place, and can be used to mitigate CSRF attacks. By default, we
|
|
| will set this value to "lax" to permit secure cross-site requests.
|
|
|
|
|
| See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#samesitesamesite-value
|
|
|
|
|
| Supported: "lax", "strict", "none", null
|
|
|
|
|
*/
|
|
|
|
'same_site' => env('SESSION_SAME_SITE', 'lax'),
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Partitioned Cookies
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| Setting this value to true will tie the cookie to the top-level site for
|
|
| a cross-site context. Partitioned cookies are accepted by the browser
|
|
| when flagged "secure" and the Same-Site attribute is set to "none".
|
|
|
|
|
*/
|
|
|
|
'partitioned' => env('SESSION_PARTITIONED_COOKIE', false),
|
|
|
|
];
|