Sicher mit Sessions umgehen

Wie Session Fixation verhindert werden kann, habe ich bereits gezeigt. In diesem Beitrag möchte ich mich um grundsätzliches im Umgang mit Sessions beschäftigen.

1. Session-IDs sind in der URL offengelegt

Die Session-ID sollte ein Geheimnis zwischen dem User und der Applikation sein. Diese in der URL mitzuschliefen ist sehr gefährlich. Der User muss den Link nur mit jemanden Teilen, schon int ein Dritter ein eingeloggter User. Zum Glück ist die Übergabe per Cookie der Standardfall in PHP, die Übergabe per URL erfordert einiges an Arbeit. Die PHP-Konfigruation use_trans_sid sollte den Wert 0 haben.

2. Sessions werden nicht richtig geschlossen

Sessions müssen ablaufen können! Es kann nicht davon ausgegangen werden, dass die User auf “Logout” klicken. Je mehr offene Sessions auf dem Server rumliegen, um so größer die Wahrscheinlichkeit, dass ein Angreifer eine korrekte Session-ID findet.

Das Problem lässt sich zuverlässig nur auf eine Art löschen: Wir müssen ein Timestamp im Session ablegen. Hier ein Beispiel:

$threshold = 30 * 60 * 60; // 30 Minuten Inaktivität soll User ausloggen
if (isset($_SESSION['lastActivity']) && $_SESSION['lastActivity'] + $threshold > time()) {
    session_unset();
    session_destroy();
} else {
    $_SESSION['lastActivity'] = time();
}

Selbstverständlich muss der Server auch angewiesen werden, alte Sessions zu löschen, falls der User nicht versucht diese Session wieder aufzurufen. Dazu wird die PHP-Konfiguration session.gc_maxlifetime.

3. Session-IDs werden bei erfolgreichem Login nicht erneuert

Nach jedem Login sollten die Session-ID neu generiert werden. In PHP geht das mit der Funktion session_regenerate_id. Wenn unser Session-Fixation-Beispiel genutzt wird, dann kann einfach

$_SESSION['initiated'] = null;

gesetzt werden.

4. Passworte und Session-IDs werden über eine unsichere Verbindung gesendet

So lange die Session-IDs und Passworte über eine normale HTTP-Verbindung gesendet werden, können alle mitlesen. Der einzige Schutz liegt leider nicht in PHP, sondern darin die Seite nur über HTTPS anzubieten. SSL-Zertifikate sind gar nicht so teuer, es gibt sie mitlerweile kostenlos.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert