Signatur
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();
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();
// 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 ,).