Start · Sprachen · PHP · Referenz · SessionIdInterface

SessionIdInterface

Interface

Definiert eine optionale Schnittstelle für benutzerdefinierte Session-Handler, die eine eigene Session-ID-Generierung implementieren.

seit PHP 5.5.1 Kategorie: http

Signatur

interface SessionIdInterface

Beschreibung

SessionIdInterface ist ein optionales Interface für benutzerdefinierte Session-Handler, die über session_set_save_handler() registriert werden. Implementiert eine Klasse dieses Interface, wird die Methode create_sid() verwendet, um beim Start einer neuen Session eine eigene Session-ID zu erzeugen, anstatt die interne PHP-Implementierung zu nutzen.

Dieses Interface ergänzt das Pflicht-Interface SessionHandlerInterface, das die grundlegenden Speicher- und Ladevorgänge einer Session definiert. SessionIdInterface allein ist nicht ausreichend — es muss stets zusammen mit SessionHandlerInterface (oder einer davon abgeleiteten Implementierung) verwendet werden.

Typische Anwendungsfälle sind die Erzeugung kryptografisch sicherer oder datenbankkonformer Session-IDs, die Integration eigener ID-Schemata (z. B. UUIDs) oder die Erweiterung bestehender Session-Handler um eine kontrollierte ID-Generierung. PHP ruft create_sid() automatisch auf, wenn eine neue Session initialisiert wird und der Handler dieses Interface implementiert.

Seit PHP 7.0 existiert auch SessionUpdateTimestampHandlerInterface, das weitere optionale Methoden für Zeitstempel-basierte Session-Verwaltung bereitstellt. Alle drei Interfaces lassen sich kombinieren, um einen vollständigen benutzerdefinierten Session-Handler zu bauen.

Beispiele

Eigener Session-Handler mit UUID-basierter Session-ID

<?php
class MySessionHandler extends SessionHandler implements SessionIdInterface
{
    public function create_sid(): string
    {
        // Erzeuge eine UUID v4 als Session-ID
        $data = random_bytes(16);
        $data[6] = chr((ord($data[6]) & 0x0F) | 0x40); // Version 4
        $data[8] = chr((ord($data[8]) & 0x3F) | 0x80); // Variant
        return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
    }
}

$handler = new MySessionHandler();
session_set_save_handler($handler, true);
session_start();

echo 'Session-ID: ' . session_id();
Session-ID: a3f1e2d4-9b8c-4a7e-b6f5-1c2d3e4f5a6b

Vollständig eigener Session-Handler mit benutzerdefinierter ID

<?php
class FileSessionHandler implements SessionHandlerInterface, SessionIdInterface
{
    private string $savePath;

    public function create_sid(): string
    {
        // Präfixbasierte ID mit Zufallsanteil
        return 'app_' . bin2hex(random_bytes(16));
    }

    public function open(string $path, string $name): bool
    {
        $this->savePath = $path;
        return is_dir($path) ?: mkdir($path, 0755, true);
    }

    public function close(): bool
    {
        return true;
    }

    public function read(string $id): string|false
    {
        $file = $this->savePath . '/sess_' . $id;
        return file_exists($file) ? (string)file_get_contents($file) : '';
    }

    public function write(string $id, string $data): bool
    {
        return file_put_contents($this->savePath . '/sess_' . $id, $data) !== false;
    }

    public function destroy(string $id): bool
    {
        $file = $this->savePath . '/sess_' . $id;
        return file_exists($file) ? unlink($file) : true;
    }

    public function gc(int $max_lifetime): int|false
    {
        $count = 0;
        foreach (glob($this->savePath . '/sess_*') as $file) {
            if (filemtime($file) + $max_lifetime < time()) {
                unlink($file);
                $count++;
            }
        }
        return $count;
    }
}

$handler = new FileSessionHandler();
session_set_save_handler($handler, true);
session_start();

echo 'Meine Session-ID: ' . session_id();
Meine Session-ID: app_7f3a2b1c4e5d6f7a8b9c0d1e2f3a4b5c

// Wichtig · Fallstricke

Sicherheitshinweis: Eigene Session-ID-Generierungen müssen ausreichend Entropie besitzen, um Session-Hijacking und Session-Fixation-Angriffe zu verhindern. Verwende stets random_bytes() oder openssl_random_pseudo_bytes() als Basis. IDs mit zu wenig Zufälligkeit können durch Brute-Force erraten werden.

Kompatibilität: SessionIdInterface ist optional. Implementiert der Handler das Interface nicht, generiert PHP intern eine Session-ID auf Basis der in php.ini konfigurierten Parameter (session.sid_length, session.sid_bits_per_character).

Eindeutigkeit prüfen: PHP prüft standardmäßig nicht, ob die von create_sid() zurückgegebene ID bereits existiert. Stelle sicher, dass generierte IDs systemweit eindeutig sind, oder implementiere eine Kollisionsprüfung in deinem Handler.

Das Interface definiert nur die Methode create_sid(): string ohne Parameter. Rückgabewert muss ein gültiger, nicht-leerer String sein, der nur Zeichen enthält, die in Session-IDs erlaubt sind (alphanumerisch sowie - und ,).