Tenga en cuenta que, aunque los usuarios no pueden cambiar nada después de restablecer los datos de sesión y/o cookie, aún pueden ver información habitual accesible para un usuario que inició sesión tal como apareció en la última visita. Esto se debe a que el navegador almacena en caché la página.
Debe asegurarse de agregar el encabezado en cada página a la que pueda acceder un usuario conectado, indicándole al navegador que los datos son confidenciales y que no deben almacenar en caché el resultado del script para el botón Atrás. Es importante añadir
header("Cache-Control: no-cache, must-revalidate");
Tenga en cuenta que esos otros elementos que no sean el resultado inmediato de la secuencia de comandos bajo esta cabecera, todavía se almacenan en caché y que pueden beneficiarse de ella. Asegúrese de cargar gradualmente partes de su página y etiquetar datos confidenciales y el HTML principal con este encabezado.
Como sugiere la respuesta, desconectar la parte de logged_in
$_SESSION
variable global puede alcanzar el registro, pero ser conscientes de que en primer lugar, que no es necesario destruir la sesión como se menciona en el PHP's session_destroy()
documentation
Nota: no tiene que llamar a session_destroy() desde el código habitual. Limpie la matriz $ _SESSION en lugar de destruir los datos de la sesión.
Y en segundo lugar, es mejor no destruir la sesión en absoluto como lo explica la siguiente advertencia en la documentación.
Además, unset()
es una función perezosa; lo que significa que no aplicará el efecto, hasta el próximo uso de la variable (parte de) en cuestión. Es una buena práctica usar la asignación para un efecto inmediato en casos sensibles, principalmente variables globales que pueden usarse en solicitudes simultáneas. Le sugiero que use en su lugar:
$_SESSION['logged_in'] = null;
y dejar que el recolector de basura que se acumula, al mismo tiempo, no es válido como un usuario conectado.
Por último, para completar la solución, aquí están algunas de las funciones:
<?php
/*
* Check the authenticity of the user
*/
function check_auth()
{
if (empty($_SESSION['logged_in']))
{
header('Location: login.php');
// Immediately exit and send response to the client and do not go furthur in whatever script it is part of.
exit();
}
}
/*
* Logging the user out
*/
function logout()
{
$_SESSION['logged_in'] = null;
// empty($null_variable) is true but isset($null_variable) is also true so using unset too as a safeguard for further codes
unset($_SESSION['logged_in']);
// Note that the script continues running since it may be a part of an ajax request and the rest handled in the client side.
}
No tiene que deshabilitar nada. Si vuelven, se les envía la versión almacenada en caché de la página restringida. Si intentan hacer clic en él, nada funcionará porque no se establecerá la sesión adecuada. –
@ N.B. Una posible solución que podría no ser siempre utilizable, ya que el usuario podría tener datos confidenciales en su pantalla y luego cerrar sesión. Otro viene (aunque la estación de trabajo debe estar bloqueada;)) y presiona hacia atrás y ve (aunque en caché) los datos del usuario anterior. Por lo general, agregamos un mensaje de información que alerta al usuario para que cierre el navegador (solo para asegurarse de que se hayan borrado todas las sesiones). No es necesariamente la mejor manera, pero al menos le dio al usuario la información sobre el posible problema. – Juri
Una solución económica si todo lo demás falla es el mensaje "Cierre esta ventana por motivos de seguridad" en la página cerrada. – izb