<?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']);
}
?>