session_destroy() ne fonctionne pas

Invité
Invité n'ayant pas de compte PHPfrance

29 janv. 2007, 11:16

Bonjour,

Je dois créer un accès protéger par mdp pour un logiciel en php. Ok rien de compliquer avec les sessions jusque là.
Après que les utilisateurs se soient identifier, je fais un session_generate_id() qui fonctionne très bien (vérifié avec session_id()).
Mais quand je veux qu'ils se déloguent la fonction session_destroy() ne marche pas.
Voici mon code de logout :

Code : Tout sélectionner

<?php // On appelle la session session_start(); echo "ma session de depart et mon login"; echo session_id() ; echo $_SESSION['login'] ; // On écrase le tableau de session $_SESSION = array(); echo "apres je ne vois plus le login que l'id" ; echo session_id() ; echo $_SESSION['login'] ; if (session_destroy()) { echo 'Session détruite !'; } else { echo 'Erreur : impossible de détruire la session !'; } echo "je ne vois plus rien normalement" ; echo session_id() ; echo $_SESSION['login'] ; // header("Location: index.php"); ?>
le résultat est "parfait" :

Code : Tout sélectionner

ma session de depart et mon login009d09e217da866152c2baece47f00b6GDZ01apres je ne vois plus le login009d09e217da866152c2baece47f00b6Session détruite !je ne vois plus rien normalement
Seulement, quand je retourne sur index.php la valeur de session réaffichée sur un echo session_id() est bien l'ancienne !! J'ai beau vider le cache de mon navigateur rien n'y fait. :evil:
Je suis en PHP 4.3.10 ... HELP !!

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

29 janv. 2007, 11:24

J'avais déjà rencontré ce soucis... je ne sais plus trop comment je l'avais géré, mais j'avais du enchainer les session_destroy(), les unset(), $_SESSION = array(), ...

Et au final j'avais réussi à avoir sa peau à cette %$[censuré]@!! de session ;)

ceci dit, je crois qu'il y avait un autre problème avec le session_destroy(), c'était qu'une fois détruite il ne pouvait plus créer de nouvelle session, et c'était pour ça également que javais opté pour l'écrasement ou vidage du tableau...


Edit : bon ben en fait en jetant un coup d'oeil dans la doc du destroy ...
Pour détruire complètement une session, comme faire sortir l'utilisateur, l'identifiant de la session doit également être effacé. Si un cookie est utilisé pour propager l'identifiant de session (comportement par défaut), alors le cookie de session doit être effacé. La fonction setcookie() peut être utilisée pour cela.
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

cagou2
Invité n'ayant pas de compte PHPfrance

31 janv. 2007, 01:20

Merci bcp du retour.
A force de tripatouillage j'étais arrivé à la conclusion que le cookie persistait (je ne savais pas que sur Firefox le fait de vider le cache ne suffit pas à enlever cookie et cie). le session_destroy() fonctionne bien ...
Pb, je n'ai pas utilisé le setcookie à l'origine, du coup impossible de faire effacer ce %$![censuré aussi]§ de cookie du navigateur.
J'essaie l'enchainement suivant (parmi bien d'autres essayé) :

Code : Tout sélectionner

session_start(); // On écrase le tableau de session $_SESSION = array(); // on détruit le cookie setCookie ($_COOKIE[session_name()]); // On détruit la session //session_destroy();
Mais rien n'y fait celui-ci reste actif sur le navigateur et est donc reprit à la connexion suivante de l'utilisateur

ViPHP
AB
ViPHP | 5818 Messages

31 janv. 2007, 02:19

Bonsoir,

Moi aussi j'ai eu des pb avec session_destroy(); et donc je fais comme vous, j'écrase le tableau des sessions avec $_SESSION = array();

Mais si tu fais un isset($_SESSION['login']) pour la protection de tes pages, celles-ci deviennent inaccessibles dès $_SESSION = array() donc je ne comprend pas pourquoi tu cherches à effacer le cookie qui contient l'identifiant de session...?

cagou2
Invité n'ayant pas de compte PHPfrance

01 févr. 2007, 09:05

Bon ok admettons que je sois puriste :)
mais j'aimerais bien que mon utilisateur lorsqu'il arrive sur la page de login pour se reconnecter n'est pas comme identifiant de session le même que celui qu'il avait 5 min. avant.
Ok je fais un session_regenerate_id() si le login réussi mais bon ...
et puis c'est aussi la curiosité du (grand) débutant : j'aimerais savoir comment faire pour effacer le cookie sur le navigateur client. :wink:

ViPHP
AB
ViPHP | 5818 Messages

01 févr. 2007, 17:52

Bonjour,

Puriste, c'est pas peu dire :wink: d'autant que ce cookie, puisqu'il s'agit d'un cookie de session, sera effacé automatiquement lorsque le visiteur fermera la fenêtre de son navigateur.

Mais bon je garde un oeil sur le topic, au cas où quelqu'un aurait la solution.

Edit : Cela dit si tu veux plus de sécurité sur tes pages protégées, il faut faire sur chacune d'entre elle:
session_start();
$tmpSession = $_SESSION;
$_SESSION = array();
session_regenerate_id();
$_SESSION = $tmpSession; 
car d'après ce que j'ai lu, le fait de changer l'id de session ne veux pas dire que le contenu des sessions précédentes est effacé. Avec cette méthode, pas de doute.

ViPHP
ViPHP | 1961 Messages

01 févr. 2007, 20:59

Bonjour,

session_destroy() ne détruit pas les variables globales, c'est à dire les $_SESSION['qq_chose'], ni le cookie coté utilisateur(si c'est l'option choisie -- c'est celle par défaut). Il faut le faire à la main.

La première des choses à faire c'est de récupérer le nom de la session pour pouvoir supprimer le cookie.
$session_name = isset($_COOKIE[session_name()]) ? session_name() : '';
Je vous propose deux soluces pour la partie des variables globales:

1 - En utilisant $_SESSION = Array(), et laisser faire le reste du travail au garbage colector (ça risque de prendre un certain temps (paramétrage serveur).

2- En supprimant une à une les globales de session
foreach($_SESSION as $key => $value) { unset($_SESSION[$key]); }
C'est la solution que je conseille.

Ensuite supprimer le cookie
if (!empty($session_name)) {
   setcookie(session_name(), '', time()-42000, '/');
}
Et c'est seulement maintenant que l'on détruit la session.
Au total ça nous donnerait un code comme ceci (je suppose que vous laissez PHP attribuer le nom de la session)
session_start();
// On récupère le nom (la session a peut-être été initialisée dans une autre page)
$session_name = isset($_COOKIE[session_name()]) ? session_name() : '';
// Destruction des globales de session
foreach($_SESSION as $key => $value) { unset($_SESSION[$key]); }
// Destruction du cookie (il n'a peut-être pas encore été créé)
if (!empty($session_name)) {
   setcookie(session_name(), '', time()-42000, '/')
};
// Destruction de la session
session_destroy();
// Génération d'une nouvelle session
session_start();
Modifié en dernier par Ajoloca le 01 févr. 2007, 21:54, modifié 2 fois.
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

ViPHP
AB
ViPHP | 5818 Messages

01 févr. 2007, 21:48

Re bonjour,

Ajoloca,

Ok j'utiliserai
foreach($_SESSION as $key => $value) { unset($_SESSION[$key]); } 
plutôt que
$_SESSION = Array()
puisque tu dis que c'est plus rapide.

Maintenant, as-tu confirmation que lorsqu'on fait un session_regenerate_id();
l'identification de session est changé mais que le contenu des sessions précédentes n'est pas effacé? J'ai lu ça une fois dans une thèse, mais depuis pas d'autres confirmations. Je fais donc ça par précaution. Peut-être que les nouvelles versions de php ont résolu ce pb?

note : pour ceux qui font du copié collé pour essayer mais sans vérifier le code, petite faute de clavier dans ta récap à la troisième ligne : foreach($_SESION as...

Petit nouveau ! | 5 Messages

09 févr. 2007, 08:40

Je me suis inscrit ! Qui a osé prendre cagou ? :evil: Bon voilà cagou2

Bon j'ai un peu trainé à répondre car étant parti navigué sur les océans très tumultueux des CCS et autres XHTML. Je m'était arrêté à l'HTML d'il y a 4-5 ans moi ! Voilà la claque
:?

En tout cas merci à tous de vos réponses.
@Ajocola : ton script est parfait : effectivement, je n'effaçais pas correctement le cookie avant. Maintenant ça marche du tonnerre. :D

Si Ryle ou un autre modo peuvent mettre le tag [Résolu] ce serait sympa car je n'étais qu'invité quand j'ai créé ce thread.

A +

Eléphant du PHP | 164 Messages

09 févr. 2007, 14:54

utilisez ça:

choissez la fonction qui vous interesse
session_unregister() // Supprime une variable dans la session courante 
session_unset() // Détruit toutes les variables de session 

ViPHP
ViPHP | 1961 Messages

09 févr. 2007, 18:22

Bonjour,
Note: Si vous utilisez $_SESSION (ou $HTTP_SESSION_VARS pour PHP 4.0.6 ou plus ancien), utilisez unset() pour détruire une variable de session, i.e. unset($_SESSION['nomvariable']);.
Comme on ne sais pas à l'avance la version, il est plus judicieux d'utiliser une formule qui fonctionne partout.
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein