Page 1 sur 1

Supprimer une session

Posté : 23 juil. 2008, 17:40
par Nonoteam
Bonjour,

Pour gérer un espace membre, je crée, à la connexion d'un utilisateur, un fichier de session contenant diverses variables.
A chaque page je régénère l'identifiant de session à l'aide de session_regenerate_id();

En effectuant session_regenerate_id(true), l'identifiant de la session en cours est immédiatement changé, aucun nouveau fichier n'est créé.

D'autre part, une variable de session et un cookie contiennent une chaîne aléatoire, je vérifie que les deux sont identiques pour continuer.

C'est donc là que le problème des accès concurrents se pose, lorsqu'une douzaine de pages sont chargées simultanément, la valeur du cookie et celle de la variable de session diffèrent à un moment et la session est instantanément détruite.

Le problème est réglé en passant l'argument de la fonction à 'false' : session_regenerate_id(false);
De la sorte, un nouveau fichier de session est créé avec un nouvel identifiant, l'ancien n'est pas supprimé.

Au cours de la visite du site, on a donc plusieurs fichiers de sessions qui se créent à chaque demande d'une page, ce qui augmente la probabilité de trouver une session valide et de la voler. D'autant plus qu'a la déconnexion, seule la dernière session en cours est supprimée.

J'aimerais donc pouvoir supprimer les anciens fichiers de sessions au bout d'un certain laps de temps afin de pouvoir gérer les accès concurrents à plusieurs pages.

Comment ainsi supprimer un ancien fichier session automatiquement ?

J'ai pensé à la fonction unlink(), je pourrais enregistrer l'identifiant ainsi que sa durée de vie de l'ancien fichier de session dans le nouveau. En testant si sa durée de vie est dépassée, je supprimerais l'ancien fichier.

Cependant, je ne sais pas s'il est possible de supprimer un fichier protégé par .htaccess, non plus si la suppression est propre.
De plus si une page n'est pas chargée, il peut rester en vie encore un long moment.

Est ce qu'il y aurait une solution automatique ? Peut être en définissant la durée de vie avec session_set_cookie_params($lifetime) du cookie de session en cours juste avant de régénérer l'identifiant ?
Le fichier n'est pas supprimé pour autant et l 'ancienne session semble encore valide.

Comment y remédier ?

D'avance merci.

Posté : 23 juil. 2008, 19:55
par Sékiltoyai
Le problème c'est que tes n fichiers contiennent des données différentes, donc si un utilisateur ouvre n page, il aura n sessions contenant des données différentes.
Ensuite pourquoi considères-tu qu'un utilisateur va ouvrir plusieurs pages en même temps ?

Par ailleurs quelle est l'utilité de regénérer l'identifiant de session ?

Posté : 23 juil. 2008, 21:06
par Nonoteam
Bonsoir,
Merci de ta réponse.

Un utilisateur peut très bien ouvrir plusieurs pages dans différents onglets, ce qu'il m'arrive parfois de faire.
En régénérant l'identifiant de session, je m'assure que, même si un identifiant arrive à être trouvé, celui-ci ne pourra pas servir longtemps. Seulement si les anciens sont supprimés, sinon c'est bien évidemment encore pire.

Je génère à chaque page une chaine aléatoire que j'enregistre dans une variable de session et un cookie, puis je vérifie si les deux sont identiques. C'est pourquoi si l'opération est faite trop rapidement plusieurs fois (ouverture de plusieurs pages), l'accès est coupé car la valeur du cookie et de la session ne sont plus les mêmes.

Y aurait-il d'autres solutions ?
Merci.