2012-05-09 42 views
11

No deseo que el usuario regrese a las páginas protegidas haciendo clic en el botón Atrás después de cerrar la sesión. En mi código de cierre de sesión, estoy desactivando las sesiones y redireccionando a la página de inicio de sesión. Pero creo que el navegador está almacenando en caché la página para que se vuelva visible a pesar de que la sesión se destruye desde el cierre de sesión.Prevenir el botón Atrás después de cerrar sesión

soy capaz de evitar esto, al no permitir que el navegador almacena en caché

header("Cache-Control", "no-cache, no-store, must-revalidate")

Pero de esta manera me estoy perdiendo la ventaja de caché del navegador.

Por favor sugiera una mejor manera de lograr esto. Creo que debe haber una forma de manejar esto mediante el lado del cliente de JavaScript

+5

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. –

+0

@ 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

+0

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

Respuesta

10

Implemente esto en PHP y no en javascript.

En la parte superior de cada página, comprobar para ver si el usuario se registra en caso contrario, deben ser redirigidos a una página de acceso:.

<?php 
     if(!isset($_SESSION['logged_in'])) : 
     header("Location: login.php"); 
?> 

Como usted ha mencionado, al cerrar la sesión, simplemente desarmar el logged_in variable de sesión, y destruir la sesión:

<?php 
     unset($_SESSION['logged_in']); 
     session_destroy(); 
?> 

Si el usuario hace clic hacia atrás ahora, ninguna variable de sesión logged_in estará disponible, y la página no se carga.

+19

Ya he implementado esta técnica. Pero presionar el botón Atrás en realidad no solicita al servidor. En cambio, la página posterior se representa desde el caché del navegador. Por lo tanto, no está redirigiendo a la página de inicio de sesión. – piyush

+0

Entonces, ¿cuál es el problema? El usuario no puede interactuar con el servidor después de cerrar la sesión y con el botón Atrás solo recupera los datos que ya ha visto.Si esos datos pueden ser mal utilizados por otra persona, solo fíjese que el usuario cierre la ventana o use una pestaña anónima, si no lo hace, es su culpa. – david

0

Puede insertar una condición/función en cada página restringida, verificando si la variable de sesión apropiada está configurada o no. De esta manera, puede imprimir 2 versiones de la página (una para los usuarios válidos y otra redireccionando a la página de inicio de sesión)

+1

Ya lo he implementado. Pero no impedirá que el usuario represente la página cuando se haga clic en el botón Atrás, ya que se representa desde el caché del navegador. Aunque, si el usuario actualiza la página o realiza alguna acción en la página, se le redirigirá nuevamente a la página de inicio de sesión. Dado que puede haber poca información personal en las páginas interiores, quiero restringir al usuario para que pueda ver las páginas anteriores presionando el botón Atrás después de cerrar la sesión. – piyush

0

Evitar que el usuario regrese no es una buena razón y, sobre todo, no es seguro.

Si prueba la sesión del usuario antes de cada acción de "administrador" realizada en el sitio web, debería estar bien, incluso si el usuario pulsa el botón Atrás, ve la página en caché y prueba algo.

"algo vinculado" devolverá un error ya que la sesión ya no es válida.

En su lugar, debe centrarse en tener una oficina administrativa realmente segura.

1

Creo que su única opción del lado del servidor es no permitir el almacenamiento en caché. En realidad, esto no es tan malo si está utilizando una aplicación pesada de Javascript, ya que su HTML principal puede ser solo una serie de llamadas JS y las Vistas se generan sobre la marcha. De esta forma, la mayor parte de los datos (JS MVC y código central) se almacena en caché, pero la solicitud de página real no.

Para agregar a los comentarios pegados a continuación, le sugiero agregar una pequeña llamada AJAX durante el tiempo de carga que se dispara incluso para las páginas almacenadas en caché que va a su servidor y verifica la sesión. Si no se encuentra la sesión, redirigiría al usuario. Este es el código del cliente y no una solución segura, claro, pero se ve mejor.

Se puede conseguir esto de tu conciencia con

Una solución barata si todo lo demás falla sería un mensaje "Por favor, cierre esta ventana por razones de seguridad" en la página de la sesión.- izb 9 de mayo de 12 a 8:36

Pero como N.B. dijo

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. 9 de mayo de 12 a 7:50

0

Aquí hay una solución fácil y rápida.

En la etiqueta del formulario de inicio de sesión, agregue target="_blank", que muestra el contenido en una ventana diferente. Luego, después de cerrar la sesión simplemente cierre esa ventana y se resuelve el problema del botón Atrás (navegador Safari).

Incluso al intentar utilizar el historial, no se mostrará la página y en su lugar se redirigirá a la página de inicio de sesión. Esto está bien para los navegadores Safari, pero para otros, como Firefox, el session_destroy(); se ocupa de ello.

0

las páginas que necesita ingresar, use setInterval por cada 1000 ms y verifique si el usuario está conectado o no usando ajax. si la sesión del usuario no es válida, redirigirlo a la página de inicio de sesión.

3

que estaba frente a este mismo problema y todo el día pasado en averiguar que, Por último rectificado de la siguiente manera:

En script de validación de inicio de sesión si el usuario es autenticado establezca un valor de sesión, por ejemplo, de la siguiente manera:

$_SESSION['status']="Active"; 

y luego, en el perfil del usuario script de poner el código siguiente fragmento:

<?php 

session_start(); 

if($_SESSION['status']!="Active") 
{ 
    header("location:login.php"); 
} 

?> 

Lo anterior código no es, única y ONL y si $_SESSION['status'] está establecido en "Active", entonces solo irá al perfil del usuario, y esta clave de sesión se establecerá en "Active" solo si el usuario está autenticado ... [¡Tenga en cuenta la negación ['! '] En el anterior fragmento de código]

Probablemente cerrar la sesión código debe ser como sigue:

{ 
    session_start(); 
    session_destroy(); 
    $_SESSION = array(); 
    header("location:login.php"); 
} 

Espero que esto ayude ... !!!

0

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. 
} 
0

añadir el siguiente código dentro de la etiqueta script en la página de inicio de sesión de HTML (o cualquier página que redireccionar después de cierre de sesión)

<script> 
history.pushState(null, null, document.title); 
window.addEventListener('popstate', function() { 
    history.pushState(null, null, document.title); 
}); 
</script> 

Esta secuencia de comandos desactivará el botón Atrás después de cerrar la sesión.

Cuestiones relacionadas