session_regenerate_id

(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)

session_regenerate_idErsetzt die aktuelle Session-ID durch eine neu erzeugte

Beschreibung

session_regenerate_id(bool $delete_old_session = false): bool

Die Funktion session_regenerate_id() ersetzt die aktuelle Session-ID durch eine neue und übernimmt die aktuellen Session-Informationen.

Wenn session.use_trans_sid aktiviert ist, darf die Ausgabe erst nach dem Aufruf von session_regenerate_id() beginnen. Andernfalls wird die alte Session-ID verwendet.

Warnung

Zurzeit kann session_regenerate_id nicht gut mit unstabilen Netzwerken, z. B. Mobil- und WiFi-Netzwerke, umgehen. Daher kann es zu verlorenen Sessions kommen, wenn session_regenerate_id aufgerufen wird.

Die alten Session-Daten sollten nicht sofort zerstört werden, sondern es sollte ein Destroy-Zeitstempel verwendet werden und der Zugriff auf die alte Session-ID sollte kontrolliert werden. Andernfalls kann ein konkurrierender Zugriff auf die Seite möglicherweise zu einem inkonsistenten Zustand führen, oder die Session kann gänzlich verloren werden, oder es kann sich eine Race-Condition im Client (Browser) ergeben und viele Session-IDs könnten nutzlos erzeugt werden. Die sofortige Löschung der Session-Daten verhindert die Erkennung von Session-Hijack-Angriffen und auch deren Vorbeugung.

Parameter-Liste

delete_old_session

Legt fest, ob die zugehörige alte Session-Datei gelöscht werden soll oder nicht. Die alten Session-Daten sollten nicht gelöscht werden, wenn Race-Conditions, die durch die Löschung verursacht werden, verhindert, oder Session-Hijack-Angriffe erkannt oder vermieden werden müssen.

Rückgabewerte

Gibt bei Erfolg true zurück. Bei einem Fehler wird false zurückgegeben.

Beispiele

Beispiel #1 Ein session_regenerate_id()-Beispiel

<?php
// ACHTUNG: dieser Code ist nicht voll funktionsfähig, sondern dient nur als Beispiel!

session_start();

// Prüfe den Destroy-Zeitstempel
if (isset($_SESSION['destroyed'])
&&
$_SESSION['destroyed'] < time() - 300) {
// Dies sollte normalerweise nicht passieren. Es könnte durch einen Angriff
// oder ein unstabiles Netzwerk verursacht worden sein.
// Entferne den Authentifizierungsstatus dieser Nutzer-Session.
remove_all_authentication_flag_from_active_sessions($_SESSION['userid']);
throw(new
DestroyedSessionAccessException);
}

$old_sessionid = session_id();

// Lege den Destroy-Zeitstempel fest
$_SESSION['destroyed'] = time(); // session_regenerate_id() speichert die
// alten Session-Daten

// Der einfache Aufruf von session_regenerate_id() kann in einer verlorenen
// Session resultieren, etc. Siehe das nächste Beispiel.
session_regenerate_id();

// Die neue Session braucht keinen Destroy-Zeitstempel
unset($_SESSION['destroyed']);

$new_sessionid = session_id();

echo
"Alte Session: $old_sessionid<br />";
echo
"Neue Session: $new_sessionid<br />";

print_r($_SESSION);
?>

Zurzeit kann das Session-Modul nicht gut mit unstabilen Netzwerken umgehen. Die Session-ID sollte selbst verwaltet werden, um verlorene Sessions durch session_regenarate_id zu verhindern.

Beispiel #2 Verhindern von verlorenen Sessions durch session_regenerate_id()

<?php
// ACHTUNG: dieser Code ist nicht voll funktionsfähig, sondern dient nur als Beispiel!
// my_session_start() und my_session_regenerate_id() verhindern verlorene Session
// durch unstabile Netzwerke. Zusätzlich kann dieser Code dem Ausnutzen einer
// gestohlenen Session durch Angreifer vorbeugen.

function my_session_start() {
session_start();
if (isset(
$_SESSION['destroyed'])) {
if (
$_SESSION['destroyed'] < time()-300) {
// Dies sollte normalerweise nicht passieren. Es könnte durch einen Angriff
// oder ein unstabiles Netzwerk verursacht worden sein.
// Entferne den Authentifizierungsstatus dieser Nutzer-Session.
remove_all_authentication_flag_from_active_sessions($_SESSION['userid']);
throw(new
DestroyedSessionAccessException);
}
if (isset(
$_SESSION['new_session_id'])) {
// Noch nicht vollständig abgelaufen. Könnte an einem verlorenen Cookie
// durch ein unstabiles Netzwerk liegen.
// Noch einmal versuchen, das ordnungsgemäße Session-ID-Cookie zu setzen.
// ACHTUNG: es sollte nicht versucht werden, die Session-ID erneut
// festzulegen, wenn das Authentifizierungsflag entfernt werden soll.
session_commit();
session_id($_SESSION['new_session_id']);
// Die neue Session-ID sollte existieren
session_start();
return;
}
}
}

function
my_session_regenerate_id() {
// Eine neue Session-ID wird benötigt, um die richtige Session-ID festzulegen,
// wenn die Session-ID aufgrund eines unstabilen Netzwerks nicht gesetzt wurde.
$new_session_id = session_create_id();
$_SESSION['new_session_id'] = $new_session_id;

// Lege den Destroy-Zeitstempel fest
$_SESSION['destroyed'] = time();

// Schreibe und schließe die aktuelle Session
session_commit();

// Starte die Session mit einer neuen Session-ID
session_id($new_session_id);
ini_set('session.use_strict_mode', 0);
session_start();
ini_set('session.use_strict_mode', 1);

// Die neue Session braucht sie nicht
unset($_SESSION['destroyed']);
unset(
$_SESSION['new_session_id']);
}
?>

Siehe auch