[security] Opravena chyba session_regenerate_id po session_destroy při obnově z remember me cookie
This commit is contained in:
+17
-2
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user