session_regenerate_id
(PHP 4 >= 4.3.2, PHP 5, PHP 7, PHP 8)
session_regenerate_id — Ersetzt die aktuelle Session-ID durch eine neu erzeugte
Beschreibung
$delete_old_session
= false
): boolDie 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.
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
- session_id() - Liefert und/oder setzt die aktuelle Session-ID
- session_create_id() - Create new session id
- session_start() - Erzeugt eine neue Session oder setzt eine vorhandene fort
- session_destroy() - Löscht alle in einer Session registrierten Daten
- session_reset() - Re-initialize session array with original values
- session_name() - Liefert und/oder setzt den Namen der aktuellen Session