2010-10-21 22 views
14

Estoy tratando de solucionar una función de cierre de sesión para una aplicación web. Cuando inicie sesión, la aplicación tiene varias cookies establecidas para su dominio. Este es el procedimiento de cierre de sesión actual:PHP: ¿por qué no puedo deshacerme de esta cookie de identificación de sesión?

  • Hace clic en un enlace, que le envía a una página de cierre de sesión
  • La página de cierre de sesión se ejecuta una función que llama session_destroy() y también recorre todas las galletas para el dominio y los pone a caducar en el pasado (ver código a continuación)
  • La página de cierre de sesión luego redirige a una página de inicio de sesión, que es HTML directo.

Al final de este proceso, todas las otras cookies son definido, pero el PHPSESSID cookie es todavía allí, tiene el mismo valor, y todavía está a punto de expirar al final de la sesión.

¿Qué me falta aquí?

Aquí está la función de cierre de sesión que he mencionado anteriormente:

function log_out_current_user() { 

     // Destroy the session 
     if (isset($_SESSION)) { 
      session_destroy(); 
     } 

     // Expire all of the user's cookies for this domain: 
     // give them a blank value and set them to expire 
     // in the past 
     if (isset($_SERVER['HTTP_COOKIE'])) { 
      $cookies = explode(';', $_SERVER['HTTP_COOKIE']); 
      foreach($cookies as $cookie) { 
       $parts = explode('=', $cookie); 
       $name = trim($parts[0]); 
       setcookie($name, '', time()-1000); 
       setcookie($name, '', time()-1000, '/'); 
      } 
      // Explicitly unset this cookie - shouldn't be redundant, 
      // but it doesn't hurt to try 
      setcookie('PHPSESSID', '', time()-1000); 
     } 

    } 

Respuesta

29

No está quitando con los mismos parámetros que se creó. Use session_get_cookie_params para obtenerlos. Para ser portátil, debe obtener el nombre de la cookie a través del session_name. Aquí hay un pequeño script para hacer eso:

$params = session_get_cookie_params(); 
setcookie(session_name(), '', 0, $params['path'], $params['domain'], $params['secure'], isset($params['httponly'])); 
Cuestiones relacionadas