session_regenerate_id
(PHP 4 >= 4.3.2, PHP 5, PHP 7)
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 umgehen, wie z.B. mobilen und WiFi-Netzwerken. Daher kann es zu verlorenen Sessions kommen, wenn session_regenarate_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 der konkurrierende 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 sofotige Löschung der Session-Daten verhindert die Erkennung von Session-Hijack-Angriffen, und ebenfalls deren Vorbeugung.
Parameter-Liste
-
delete_old_session
-
Legt fest, ob die zugehörige alte Sessiondatei 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.
Changelog
Version | Beschreibung |
---|---|
7.0.0 | session_regenerate_id() speichert die alten Session-Daten bevor die Session geschlossen wird. |
5.1.0 |
Den Parameter delete_old_session hinzugefügt
|
4.3.3 | Falls Session-Cookies aktiviert sind, wird durch die Verwendung von session_regenerate_id() nun auch ein neues Session-Cookie mit der neuen Session-ID abgegeben. |
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(); // Von PHP 7.0.0 an speichert session_regenerate_id() 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
Deutsche Übersetzung
Sie haben gebeten, diese Seite auf Deutsch zu besuchen. Momentan ist nur die Oberfläche übersetzt, aber noch nicht der gesamte Inhalt.Wenn Sie mir bei Übersetzungen helfen wollen, ist Ihr Beitrag willkommen. Alles, was Sie tun müssen, ist, sich auf der Website zu registrieren und mir eine Nachricht zu schicken, in der Sie gebeten werden, Sie der Gruppe der Übersetzer hinzuzufügen, die Ihnen die Möglichkeit gibt, die gewünschten Seiten zu übersetzen. Ein Link am Ende jeder übersetzten Seite zeigt an, dass Sie der Übersetzer sind und einen Link zu Ihrem Profil haben.
Vielen Dank im Voraus.
Dokument erstellt 30/01/2003, zuletzt geändert 26/10/2018
Quelle des gedruckten Dokuments:https://www.gaudry.be/de/php-rf-session-regenerate-id.html
Die Infobro ist eine persönliche Seite, deren Inhalt in meiner alleinigen Verantwortung liegt. Der Text ist unter der CreativeCommons-Lizenz (BY-NC-SA) verfügbar. Weitere Informationen auf die Nutzungsbedingungen und dem Autor.
Referenzen
Diese Verweise und Links verweisen auf Dokumente, die während des Schreibens dieser Seite konsultiert wurden, oder die zusätzliche Informationen liefern können, aber die Autoren dieser Quellen können nicht für den Inhalt dieser Seite verantwortlich gemacht werden.
Der Autor Diese Website ist allein dafür verantwortlich, wie die verschiedenen Konzepte und Freiheiten, die mit den Nachschlagewerken gemacht werden, hier dargestellt werden. Denken Sie daran, dass Sie mehrere Quellinformationen austauschen müssen, um das Risiko von Fehlern zu reduzieren.