Start · Sprachen · PHP · Referenz · SessionHandler

SessionHandler

Klasse

Macht den internen PHP-Session-Speicherverwalter durch Vererbung zugänglich und ermöglicht die Erweiterung oder den Austausch des Standard-Session-Backends.

seit PHP 5.4.0 Kategorie: http

Signatur

class SessionHandler implements SessionHandlerInterface, SessionIdInterface

Beschreibung

SessionHandler ist eine spezielle eingebaute PHP-Klasse, die den aktuell konfigurierten internen Session-Speicherverwalter (definiert durch session.save_handler in der php.ini) nach außen als PHP-Objekt bereitstellt. Durch Ableitung dieser Klasse können Entwickler einzelne Speicherschritte (Öffnen, Schließen, Lesen, Schreiben, Löschen, Garbage Collection) selektiv überschreiben und so eigene Logik ergänzen, ohne den gesamten Mechanismus neu implementieren zu müssen.

Typische Anwendungsfälle sind das transparente Verschlüsseln oder Komprimieren von Session-Daten: Man überschreibt nur write() und read(), während der Rest der Speicherlogik (z. B. Datei-I/O) weiterhin intern durch PHP erledigt wird. Für vollständig eigene Backends (Datenbank, Redis, Memcached) empfiehlt sich stattdessen die direkte Implementierung von SessionHandlerInterface.

Die Klasse implementiert SessionHandlerInterface sowie SessionIdInterface und stellt damit die Methoden open(), close(), read(), write(), destroy(), gc() und create_sid() bereit. Nach dem Erzeugen einer Instanz (oder einer abgeleiteten Klasse) muss diese via session_set_save_handler() registriert werden, bevor session_start() aufgerufen wird.

  • Wird SessionHandler unverändert genutzt, verhält es sich exakt wie der konfigurierte interne Handler.
  • Abgeleitete Klassen können einzelne Methoden überschreiben und per parent::methode() an den internen Handler delegieren.
  • Änderungen an session.save_handler nach der Registrierung haben keine Wirkung mehr.

Parameter

Name Typ Default Beschreibung
$— SessionHandler hat keinen öffentlichen Konstruktor-Parameter. Die Klasse wird mit new SessionHandler() (oder einer abgeleiteten Klasse) ohne Argumente instantiiert.

Beispiele

Session-Daten transparent verschlüsseln (AES-256-CBC)

<?php
class EncryptedSessionHandler extends SessionHandler
{
    private string $key;

    public function __construct(string $key)
    {
        $this->key = $key;
    }

    public function read(string $id): string|false
    {
        $data = parent::read($id);
        if ($data === false || $data === '') {
            return $data;
        }
        $decoded = base64_decode($data, true);
        if ($decoded === false) {
            return '';
        }
        $ivLen  = openssl_cipher_iv_length('AES-256-CBC');
        $iv     = substr($decoded, 0, $ivLen);
        $cipher = substr($decoded, $ivLen);
        return openssl_decrypt($cipher, 'AES-256-CBC', $this->key, 0, $iv);
    }

    public function write(string $id, string $data): bool
    {
        $ivLen     = openssl_cipher_iv_length('AES-256-CBC');
        $iv        = random_bytes($ivLen);
        $encrypted = openssl_encrypt($data, 'AES-256-CBC', $this->key, 0, $iv);
        return parent::write($id, base64_encode($iv . $encrypted));
    }
}

$handler = new EncryptedSessionHandler('ein-32-zeichen-geheimer-schluessel!');
session_set_save_handler($handler, true);
session_start();

$_SESSION['benutzer'] = 'Alice';
echo $_SESSION['benutzer']; // Alice
Alice

SessionHandler unverändert registrieren (Durchleitungs-Modus)

<?php
// Nützlich zum Testen oder als Basis für spätere Erweiterungen:
$handler = new SessionHandler();
session_set_save_handler($handler, true);
session_start();

$_SESSION['hits'] = ($_SESSION['hits'] ?? 0) + 1;
echo 'Seitenaufruf Nr. ' . $_SESSION['hits'];
Seitenaufruf Nr. 1

// Wichtig · Fallstricke

Sicherheit: Der im Beispiel verwendete Schlüssel sollte niemals im Quellcode hart kodiert werden. Nutze Umgebungsvariablen oder einen Secrets-Manager. Ein zu kurzer oder vorhersehbarer Schlüssel macht die Verschlüsselung wirkungslos.

Reihenfolge: session_set_save_handler() muss zwingend vor session_start() aufgerufen werden, sonst wird der eigene Handler ignoriert. Der zweite Parameter true registriert automatisch einen register_shutdown_function()-Aufruf, der die Session beim Skript-Ende korrekt schließt.

Interner Handler: Welcher interne Handler durch parent::*-Aufrufe angesteuert wird, hängt von session.save_handler in der php.ini ab (Standard: files). Bei einem Wechsel auf user (d. h. wenn bereits ein benutzerdefinierter Handler aktiv ist) delegiert SessionHandler nicht sinnvoll weiter.

Serialisierung: read() liefert rohe, serialisierte Daten — kein PHP-Array. Das Deserialisieren unvertrauenswürdiger Session-Daten kann zu Object-Injection-Angriffen führen; vertrau ausschließlich dem von PHP selbst erzeugten Format.