[security] Opravena chyba session_regenerate_id po session_destroy při obnově z remember me cookie

This commit is contained in:
stepan
2026-03-19 09:36:41 +01:00
parent cb3e7a2969
commit 2e4c10d084
+17 -2
View File
@@ -94,7 +94,9 @@ if (isset($_SESSION['uzivatel_id']) && isset($_SESSION['email'])) {
if (isset($_SESSION['posledni_aktivita']) && if (isset($_SESSION['posledni_aktivita']) &&
(time() - $_SESSION['posledni_aktivita']) > SESSION_EXPIRACE) { (time() - $_SESSION['posledni_aktivita']) > SESSION_EXPIRACE) {
// Session vypršela zrušíme ji // Session vypršela zrušíme ji.
// DŮLEŽITÉ: Po session_destroy() není žádná aktivní session.
// Krok 2 (remember me) to musí zohlednit viz níže.
$_SESSION = []; $_SESSION = [];
session_destroy(); session_destroy();
@@ -164,7 +166,20 @@ if (!$auth_prihlasen &&
if ($cookie_ok) { if ($cookie_ok) {
// Cookie je platná obnovíme session // Cookie je platná obnovíme session.
//
// OPRAVA CHYBY: Pokud v kroku 1 vypršela session a byla zničena
// přes session_destroy(), není nyní žádná aktivní session.
// session_regenerate_id() by selhalo s warningem "no active session",
// ten warning by odeslal výstup, a tím by znemožnil setcookie()
// a header() níže.
//
// Řešení: pokud session není aktivní, spustíme ji znovu
// před voláním session_regenerate_id().
if (session_status() !== PHP_SESSION_ACTIVE) {
session_start();
}
// Regenerujeme session ID (ochrana před session fixation) // Regenerujeme session ID (ochrana před session fixation)
session_regenerate_id(true); session_regenerate_id(true);