2009-02-03 10 views
18

J'ai entendu des réponses mitigées sur ce sujet, alors qu'est-ce qu'un moyen sûr de détruire une session PHP?Vraiment détruire une session PHP?

session_start(); 
if(isset($_SESSION['foo'])) { 
    unset($_SESSION['foo']; 
    ... 
} 
session_destroy(); 

Dans le cas le plus simple, cela suffirait-il vraiment pour mettre fin à la session entre l'utilisateur et le serveur?

+0

Jetez un oeil à: http://stackoverflow.com/questions/10648565/destroying-php-session/10662060#10662060 – Brett

Répondre

40

Pour détruire une session, vous devez prendre les mesures suivantes:

  • supprimer les données de session
  • annuler la session ID

Pour ce faire, je « D utiliser ceci:

session_start(); 
// resets the session data for the rest of the runtime 
$_SESSION = array(); 
// sends as Set-Cookie to invalidate the session cookie 
if (isset($_COOKIE[session_name()])) { 
    $params = session_get_cookie_params(); 
    setcookie(session_name(), '', 1, $params['path'], $params['domain'], $params['secure'], isset($params['httponly'])); 
} 
session_destroy(); 

Et pour être sûr que l'ID de session est valide, vous ne devez autoriser les ID de session qui ont été initiés par votre script. Donc, définir un indicateur et vérifier si elle est définie:

session_start(); 
if (!isset($_SESSION['CREATED'])) { 
    // invalidate old session data and ID 
    session_regenerate_id(true); 
    $_SESSION['CREATED'] = time(); 
} 

De plus, vous pouvez utiliser cet horodatage pour échanger l'ID de session périodiquement pour réduire sa durée de vie:

if (time() - $_SESSION['CREATED'] > ini_get('session.gc_maxlifetime')) { 
    session_regenerate_id(true); 
    $_SESSION['CREATED'] = time(); 
} 
+2

Super commentaires, merci Gumbo. –

+2

Je sais que c'est vieux, mais vous venez de répondre comme 3 questions en une seule réponse pour moi. Je vous remercie! – jefffan24

+0

Dans votre premier exemple sur la ligne 5, au lieu de '_COOKIES' $, il devrait être' $ _COOKIE', sinon on peut se demander pourquoi il n'a jamais détruire le cookie de session depuis 'isset ($ _ COOKIES [session_name()])' ne jamais évaluer à vrai. –

0

Dans un même site, je l'ai fait où je l'ai fait utiliser les sessions PHP, je ne détruirai réellement la session.

Le problème est que vous avez à peu près appeler session_start() pour vérifier vos variables $_SESSION, à quel point, et voilà, vous avez créé une autre session de toute façon.

donc sur mon site, je viens de faire en sorte que chaque page appelé session_start(), puis seulement unset() les parties de l'état de session cette question lors de l'utilisateur se déconnecte.

+0

Merci pour l'entrée Alnitak, ce que je soupçonnais d'appeler session_start() sur chaque page. Je vais juste continuer à désactiver les variables telles qu'elles sont utilisées. –