use_strict_mode - Realmente destruyendo una sesión de PHP?
php session use_strict_mode (3)
He escuchado respuestas contradictorias sobre este tema, entonces, ¿cuál es una forma segura de destruir una sesión de PHP?
session_start();
if(isset($_SESSION[''foo''])) {
unset($_SESSION[''foo''];
...
}
session_destroy();
En el caso más simple, ¿esto sería suficiente para terminar realmente la sesión entre el usuario y el servidor?
El Manual de PHP aborda esta pregunta.
Debe eliminar la sesión y también eliminar la cookie de sesión (si está utilizando cookies).
Vea esta página (especialmente el primer ejemplo):
En el único sitio que hice donde usé sesiones de PHP, en realidad nunca destruyo la sesión.
El problema es que tienes que llamar a session_start()
para comprobar tus variables $_SESSION
, en cuyo caso, he aquí que has creado otra sesión.
Por lo tanto, en mi sitio me aseguré de que cada página llamada session_start()
, y luego simplemente unset()
esas partes de la sesión indiquen que importa cuando el usuario cierra la sesión.
Para destruir una sesión, debes seguir los siguientes pasos:
- eliminar los datos de la sesión
- invalidar la ID de la sesión
Para hacer esto, usaría esto:
session_start();
// resets the session data for the rest of the runtime
$_SESSION = array();
// sends as Set-Cookie to invalidate the session cookie
if (isset($_COOKIE[session_name()])) {
$params = session_get_cookie_params();
setcookie(session_name(), '''', 1, $params[''path''], $params[''domain''], $params[''secure''], isset($params[''httponly'']));
}
session_destroy();
Y para asegurarse de que la ID de sesión no sea válida, solo debe permitir las ID de sesión que inició su secuencia de comandos. Establezca una bandera y verifique si está configurada:
session_start();
if (!isset($_SESSION[''CREATED''])) {
// invalidate old session data and ID
session_regenerate_id(true);
$_SESSION[''CREATED''] = time();
}
Además, puede usar esta marca de tiempo para intercambiar la ID de la sesión periódicamente para reducir su duración:
if (time() - $_SESSION[''CREATED''] > ini_get(''session.gc_maxlifetime'')) {
session_regenerate_id(true);
$_SESSION[''CREATED''] = time();
}