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

Hier Kannst Du einen Kommentar verfassen


Bitte gib mindestens 10 Zeichen ein.
Wird geladen... Bitte warte.
* Pflichtangabe
Es sind noch keine Kommentare vorhanden.

Neuigkeiten für PHP-Entwickler: Laravel 11 Veröffentlichung

Am 12. März 2024 wurde die lang erwartete Version 11 des Laravel-Frameworks veröffentlicht, die eine Reihe von spannenden Neuerungen und Verbesserungen für die PHP-Entwicklungsgemeinschaft mit sich bringt. ...

Mike94

Autor : Mike94
Kategorie: PHP Magazin

Technisches SEO bleibt relevant

Technisches SEO – Was ist das überhaupt? Technisches SEO bezieht sich auf die Optimierung der technischen Aspekte deiner Webseite. Das Ziel ist klar! ...

admin

Autor : admin
Kategorie: SEO & Online-Marketing

Was ist neu in der PHP 8.2.10

PHP 8.2.10 ist eine der neuesten Versionen von PHP, die eine Reihe von Verbesserungen und neuen Funktionen mit sich bringt. In diesem Artikel werden wir einige der herausragenden Neuerungen und Verbesserungen dieser Version diskutieren. ...

admin

Autor : admin
Kategorie: Software-Updates

Tutorial veröffentlichen

Tutorial veröffentlichen

Teile Dein Wissen mit anderen Entwicklern weltweit

Du bist Profi in deinem Bereich und möchtest dein Wissen teilen, dann melde dich jetzt an und teile es mit unserer PHP-Community

mehr erfahren

Tutorial veröffentlichen

Seltsames Verhalten von execute() oder Fehler meinerseits

Hallo liebe Community, ich habe ein kleines Problem und vielleicht kann mir ja jemand helfen, würde ich mich sehr drüber freuen. Unten steht e ...

Geschrieben von garibaldiwz am 22.03.2024 13:03:12
Forum: SQL / Datenbanken
Google reCAPTCHA in Kontaktformular einbinden

Überprüfen Sie den E-Mail-Versand: Stellen Sie sicher, dass die E-Mail-Funktion mail() ordnungsgemäß funktioniert und dass keine Fehler beim V ...

Geschrieben von Gast am 18.03.2024 04:54:16
Forum: PHP Developer Forum
`count.php`

Hallo cober93327, und Danke fuer deine Antwort! :-) Naja, so einen "Besucherzähler" auf der Webseite anzuzeigen ist schon eher etwas, das man a ...

Geschrieben von kekse1 am 17.03.2024 15:56:38
Forum: Projekthilfe
`count.php`

Es gibt dazu natuerlich auch eine recht ausfuehrliche Dokumentation in meinem GitHub-Repository Es würde meiner Ansicht nach enorm helfen, wenn D ...

Geschrieben von cober93327 am 14.03.2024 15:49:28
Forum: Projekthilfe