2010-02-11 37 views
14

Estoy intentando desconectarme correctamente de un usuario administrador. Aquí está mi función:(PHP) ¿Cómo destruir la cookie de sesión correctamente?

function logout() 
{ 
    $_SESSION = array(); //destroy all of the session variables 
    if (ini_get("session.use_cookies")) { 
     $params = session_get_cookie_params(); 
     setcookie(session_name(), '', time() - 42000, 
      $params["path"], $params["domain"], 
      $params["secure"], $params["httponly"] 
     ); 
    } 
    session_destroy(); 
} 

Básicamente, una vez que autenticar la contraseña, me puse la sesión como válida (en total sólo el 1 por el usuario). Ahora, cuando el administrador cierra la sesión, quiero destruir la sesión actual y también destruir la cookie, para que no puedan regresar a la página de administración utilizando la cookie de sesión almacenada en el navegador. pero mi código no funciona. toco cerrar sesión, y puedo navegar directamente de regreso a la página de administración. Sin embargo, si elimino mis cookies, la funcionalidad es perfecta. Entonces, ¿qué pasa con la función de eliminación de cookies aquí?

Respuesta

6

Quizás su problema no sea la cookie, sino el navegador que muestra una versión en caché de su página de administración. ¿Podría ser eso? Si desaparece al presionar F5, probablemente sea eso. Esto se puede ordenar estableciendo los encabezados cache-control correctos.

Consulte this SO question sobre la cuestión de cómo configurar el almacenamiento en caché. La pregunta es exactamente al revés (obligando a los navegadores a guardar en caché) pero sabrá qué cambiar para desactivar el almacenamiento en caché.

+0

bien, eso tiene sentido, pero ¿por qué todavía puedo acceder a la página de administración directamente incluso después de que destruí la sesión? – sepiroth

+0

@hatorade, verifique mi respuesta editada. –

+2

No importa, creo que me di cuenta: no llamé a session_start() en mi página de cierre de sesión (el texto de cierre de sesión se vincula a una página de cierre de sesión que llama a mi función anterior) – sepiroth

8

Si realmente desea cubrir todas las bases trate de hacer:

setcookie (session_id(), "", time() - 3600); 
session_destroy(); 
session_write_close(); 

Eso debería impedir aún más el acceso a los datos de la sesión para el resto de la ejecución de PHP. El navegador puede continuar mostrando la cookie de ser establecido sin embargo, la súper $ _SESSION estará en blanco

+15

En mi opinión, debe escribir 'session_name()' (que equivale a 'PHPSESSID') en la primera línea. –

Cuestiones relacionadas