2009-11-05 12 views
5

Estoy intentando crear un mecanismo de autenticación para mi aplicación PHP y estoy teniendo dificultades para destruir la sesión. He intentado desarmar el token de autenticación que se estableció previamente dentro de la matriz de sesión y la destrucción de la sesión a través deLa sesión PHP no está destruyendo después de que el usuario cerró la sesión

session_destroy,

, así como restablecer la matriz sesión por completo antes de la destrucción de la sesión. Estoy llamando a la función de encabezado y volviendo a mi página index.php al final de las llamadas a funciones. También he intentado

session_write_close

para manejar el cierre de la sesión. Cuando cierro la sesión del usuario, hago una vardump de la sesión, y no muestra ningún dato presente; sin embargo, cuando regreso a la página index.php, recupero los datos de autenticación del usuario. También hice una vardump de los datos del Post solo para asegurarme de que de alguna manera no volviera a enviar el controlador de autenticación posterior.

¿Alguna sugerencia sobre qué hacer aquí?

+0

No tiene que usar session_write_close() .. normalmente para autenticación de usuario. – mauris

Respuesta

6

en primer lugar, asegurarse de que está llamando session_start(); antes de llamar al session_destroy(); porque solo emitirá una advertencia si no lo hace.

Asimismo, desde PHP: session_destroy:

Con el fin de matar a la sesión por completo, como para conectar al usuario a cabo, el id de sesión también debe ser desarmado. Si se usa una cookie para propagar la identificación de la sesión (comportamiento predeterminado), entonces la cookie de sesión debe ser eliminada. setcookie() se puede usar para eso.
+4

+1 por no llamar a session_start en la página logout.php. – jkushner

+0

¡Si usó sesiones con nombre, no se olvide de usar session_name también! – Calmarius

0

Me gustaría comprobar lo que está enviando el navegador al servidor mediante violinista y también comprobar qué información que haya almacenado en su session.save_path

0

¿Seguro que la página no se almacena en caché?

Sustituir el token de autenticación:

session_start(); 
$_SESSION['varName'] = null; 
$_SESSION = array(); 
session_destroy(); 
0

sin embargo cuando vuelva a la página index.php

No está la página en particular acaba de ser solicitada desde el navegador ¿cache? Realice una actualización completa de la página (CTRL+F5 en la mayoría de los navegadores web).

Si esto resulta ser la causa y desea desactivar la solicitud de almacenamiento en caché, añada el siguiente conjunto de cabeceras a HTML <head> su página:

<meta http-equiv="cache-control" content="no-cache,no-store,must-revalidate"> 
<meta http-equiv="pragma" content="no-cache"> 
<meta http-equiv="expires" content="0"> 

o, en el código PHP usando la función de PHP header():

header('cache-control: no-cache,no-store,must-revalidate'); // HTTP 1.1. 
header('pragma: no-cache'); // HTTP 1.0. 
header('expires: 0'); // Proxies. 

no se olvide de borrar la memoria caché del navegador antes de probar :)

2

También vale la pena mencionar las sesiones de PHP, session_unset()>session_destroy(); No sé por qué. Después de leer PHP Manual entry on session_destroy(), parece que solo elimina los datos del contexto actual y no los borra del archivo de sesión sin formato, por lo que si no borró la cookie, puede recuperarla. Esto parece altamente contrario a la intuición (como suele ser PHP), y podría ser la razón por la que decidí (y luego olvidé el motivo) hace años usar siempre session_unset() sobre session_destroy().

Además, asegúrese de que su redirección se produzca después de hacer toda esta sesión sin sentido, ya que PHP actúa de manera que no todos los desarrolladores esperan. La mejor práctica, IMO, es seguir cada llamada header('Location: ...'); con un die;

1

Si usa solamente session_unset() entonces IE con fallas aún conserva los datos, mi sugerencia es usar ambos.

Cuestiones relacionadas