Perte de session aleatoire

Le
Karkov
Bonjour,

Je suis confronté à un problème de session sous PHP 5.2.5 et après m'etre
arraché les cheveux pendant plusieurs jours, je me décide à soliciter vos
conseils et vos expériences.
Je développe un site web avec une partie administration. Il faut bien
entendu se loguer pour y acceder. Je stocke le login et le password (haché)
dans des variables de sessions. Si ces variables de session sont fausses ou
n'existent pas, je suis redirigé sur la page de login. Jusque ici rien de
bien particulier.

Après une identification, je suis confronté à une perte de ma session de
manière totalement aléatoire. Certain jour, je vais rester connecté toute la
journée sans problème, d'autre fois, 2 ou 3 deconnection après seulement
quelques minutes à me balader dans l'espace d'admin !

Mon identifiant de session (NEEETSESSID) est passé via un cookie.

Paramètre de mon serveur apache/php (localhost)

WinXP
PHP : 5.2.5
Apache : 2.2.6

=

voici mes paramètres sessions dans mon php.ini (v 5.2.5) :

session.save_path = "c:/wamp/tmp"
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.serialize_handler = php

session.gc_probability = 1
session.gc_divisor = 100
session.gc_maxlifetime = 14400

session.bug_compat_42 = 0
session.bug_compat_warn = 1

session.entropy_length = 0
session.entropy_file =

session.cache_limiter = nocache
session.cache_expire = 180

session.use_trans_sid = 0
session.hash_function = 0

session.hash_bits_per_character = 5
url_rewriter.tags = "a=href,area=href,frame=src,input=src,formúkeentry"


Voici mon initialisation de session dans mes scripts php (avant bien entendu
tout envoi du serveur vers le client)


session_name("NEEETSESSID");

$lifetime = 3600 * 10; //10h de durée de vie, le temps de developper le site
session_set_cookie_params($lifetime);

/* Démarre la session */
session_start();

=
Enfin en analysant les entetes HTTP transitant entre le client et le
serveur, je constate que le cookies de session n'a pas été envoyé par
firefox au serveur lors d'une deconnection accidentelle.

#Exemples 1) Tous va bien :
#Requete FIREFOX=>serveur PHP


http://localhost/neeetdev/admin/index.php?pageid=page

GET /neeetdev/admin/index.php?pageid=page HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.2)
Gecko/2008091620 Firefox/3.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://localhost/neeetdev/admin/index.php?pageid=page&rep=2
Cookie: NEEETSESSID=3hvn3oj98vkt3355fg5oct90i2;

#Réponse serveur PHP => firefox

HTTP/1.x 200 OK
Date: Thu, 25 Sep 2008 07:31:12 GMT
Server: Apache/2.2.6 (Win32) PHP/5.2.5
X-Powered-By: PHP/5.2.5
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0,
pre-check=0
Pragma: no-cache
Keep-Alive: timeout=5, max—
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html


#Exemples 2) 5 secondes plus tard, tous va mal !!!
#Requete FIREFOX=>serveur PHP


http://localhost/neeetdev/admin/index.php?pageid=page

GET /neeetdev/admin/index.php?pageid=page HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.2)
Gecko/2008091620 Firefox/3.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer:
http://localhost/neeetdev/admin/index.php?pageid=cmspage&id_page=6&rep=6

#Réponse serveur PHP => firefox

HTTP/1.x 302 Found
Date: Thu, 25 Sep 2008 07:23:09 GMT
Server: Apache/2.2.6 (Win32) PHP/5.2.5
X-Powered-By: PHP/5.2.5
Set-Cookie: NEEETSESSID=9pa0ln5vm0nt9mhkbp2n8oosc1; expires=Thu, 25 Sep 2008
17:23:09 GMT; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0,
pre-check=0
Pragma: no-cache
Location: login.php
Content-Length: 0
Keep-Alive: timeout=5, max–
Connection: Keep-Alive
Content-Type: text/html


=

Enfin, en regardant dans firefox mes cookies, lorsque je suis bien connecté
et donc avant deconnection, je retrouve mon cookie de session :

Nom : NEEETSESSID
Contenu : 3hvn3oj98vkt3355fg5oct90i2
Hôte : localhost
Chemin : /
Envoi pour : Tout type de connexion
expire : jeudi 25 septembre 2008 21:19:37

Ce cookies est bien entendu modifié lors d'une deconnection.

=

Je constate également après une deconnection non solicitée que mes fichiers
de session dans le repertoire tmp du serveur apache sont toujours présents
(sess_3hvn3oj98vkt3355fg5oct90i2), mais visiblement plus valide du point de
vue de PHP, alors que je leur avais donné une durée de vie de 10h lors de
leur création.

Je rencontre aussi ce problème avec internet explorer. Ces deux navigateurs
acceptent bien entendu les cookies.

J'insite sur le caractère ALEATOIRE du problème. Certains jours, tout se
passe très bien.

Mes questions : Est ce un problème PHP ? Est un *bug* du garbage collector
des sessions qui supprimerait mes sessions? Est ce un bug plutot des
navigateurs qui pour une raison que je ne comprend pas, refuseraient parfois
d'envoyer le cookies de session.

Si vous avez quelques pistes, conseils, critiques etc Je suis preneur.

En vous remerciant d'avance pour votre aide.

Mickaël
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Yanick
Le #17435321
J'ai déjà rencontré ce problème dans le passé (random session lost) et
cela était dû au fait que les navigateurs ne peuvent stockés qu'un
nombre défini de cookies.

http://krijnhoetmer.nl/stuff/javascript/maximum-cookies/

Si ton javascript sauvegarde plus de ce nombre, le plus ancien cookie
(en l'occurence "sessid") sera remplacé par le suivant, telle une
liste LIFO

Si tel est ton problème, mon conseil est de voir à sérialiser tes
cookies de manière à stocker plus d'une information dans un même
cookie de session par le même principe de "url-ification" :
var1=val1&var2=val2&...

yanick


On 25 sep, 06:48, Karkov
Bonjour,

Je suis confronté à un problème de session sous PHP 5.2.5 et après m'etre
arraché les cheveux pendant plusieurs jours, je me décide à soliciter vos
conseils et vos expériences.
Je développe un site web avec une partie administration. Il faut bien
entendu se loguer pour y acceder. Je stocke le login et le password (haché)
dans des variables de sessions. Si ces variables de session sont fausses ou
n'existent pas, je suis redirigé sur la page de login. Jusque ici rien de
bien particulier.

Après une identification, je suis confronté à une perte de ma session de
manière totalement aléatoire. Certain jour, je vais rester connecté toute la
journée sans problème, d'autre fois, 2 ou 3 deconnection après seulement
quelques minutes à me balader dans l'espace d'admin !

Mon identifiant de session (NEEETSESSID) est passé via un cookie.

Paramètre de mon serveur apache/php (localhost)

WinXP
PHP : 5.2.5
Apache : 2.2.6

========>
voici mes paramètres sessions dans mon php.ini (v 5.2.5) :

session.save_path = "c:/wamp/tmp"
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain > session.cookie_httponly > session.serialize_handler = php

session.gc_probability = 1
session.gc_divisor     = 100
session.gc_maxlifetime = 14400

session.bug_compat_42 = 0
session.bug_compat_warn = 1

session.entropy_length = 0
session.entropy_file >
session.cache_limiter = nocache
session.cache_expire = 180

session.use_trans_sid = 0
session.hash_function = 0

session.hash_bits_per_character = 5
url_rewriter.tags = "a=href,area=href,frame=src,input=src,formúkeentry"

=======> Voici mon initialisation de session dans mes scripts php (avant bien entendu
tout envoi du serveur vers le client)

session_name("NEEETSESSID");

$lifetime = 3600 * 10; //10h de durée de vie, le temps de developper le site
session_set_cookie_params($lifetime);

/* Démarre la session */
session_start();

========> Enfin en analysant les entetes HTTP transitant entre le client et le
serveur, je constate que le cookies de session n'a pas été envoyé par
firefox au serveur lors d'une deconnection accidentelle.

#Exemples 1) Tous va bien :
#Requete FIREFOX=>serveur PHP

http://localhost/neeetdev/admin/index.php?pageid=page

GET /neeetdev/admin/index.php?pageid=page HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.2)
Gecko/2008091620 Firefox/3.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer:http://localhost/neeetdev/admin/index.php?pageid=page&rep=2
Cookie: NEEETSESSID=3hvn3oj98vkt3355fg5oct90i2;

#Réponse serveur PHP => firefox

HTTP/1.x 200 OK
Date: Thu, 25 Sep 2008 07:31:12 GMT
Server: Apache/2.2.6 (Win32) PHP/5.2.5
X-Powered-By: PHP/5.2.5
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0,
pre-check=0
Pragma: no-cache
Keep-Alive: timeout=5, max—
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html

#Exemples 2) 5 secondes plus tard, tous va mal !!!
#Requete FIREFOX=>serveur PHP

http://localhost/neeetdev/admin/index.php?pageid=page

GET /neeetdev/admin/index.php?pageid=page HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.2)
Gecko/2008091620 Firefox/3.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer:http://localhost/neeetdev/admin/index.php?pageid=cmspage&id_page=6&rep=6

#Réponse serveur PHP => firefox

HTTP/1.x 302 Found
Date: Thu, 25 Sep 2008 07:23:09 GMT
Server: Apache/2.2.6 (Win32) PHP/5.2.5
X-Powered-By: PHP/5.2.5
Set-Cookie: NEEETSESSID=9pa0ln5vm0nt9mhkbp2n8oosc1; expires=Thu, 25 Sep 2008
17:23:09 GMT; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0,
pre-check=0
Pragma: no-cache
Location: login.php
Content-Length: 0
Keep-Alive: timeout=5, max–
Connection: Keep-Alive
Content-Type: text/html

==============>
Enfin, en regardant dans firefox mes cookies, lorsque je suis bien connecté
et donc avant deconnection, je retrouve mon cookie de session :

Nom : NEEETSESSID
Contenu : 3hvn3oj98vkt3355fg5oct90i2
Hôte : localhost
Chemin : /
Envoi pour : Tout type de connexion
expire : jeudi 25 septembre 2008 21:19:37

Ce cookies est bien entendu modifié lors d'une deconnection.

==============>
Je constate également après une deconnection non solicitée que mes fichiers
de session dans le repertoire tmp du serveur apache sont toujours présents
(sess_3hvn3oj98vkt3355fg5oct90i2), mais visiblement plus valide du point de
vue de PHP, alors que je leur avais donné une durée de vie de 10h lors de
leur création.

Je rencontre aussi ce problème avec internet explorer. Ces deux navigateurs
acceptent bien entendu les cookies.

J'insite sur le caractère ALEATOIRE du problème. Certains jours, tout se
passe très bien.

Mes questions : Est ce un problème PHP ? Est un *bug* du garbage collector
des sessions qui supprimerait mes sessions? Est ce un bug plutot des
navigateurs qui pour une raison que je ne comprend pas, refuseraient parfois
d'envoyer le cookies de session.

Si vous avez quelques pistes, conseils, critiques etc... Je suis preneur.

En vous remerciant d'avance pour votre aide.

Mickaël


Karkov
Le #17532961
Bonjour,

Un grand merci avec quelques jours de retard. En regardant le nombre de mes
cookies, effectivement le problème venait de là : J'utilise également sur
mon projet le module tafeltree qui me générait pas loin de 50 cookies.
Ajouté à mes propres cookies et je dépassais alors les 50 !
Finalement, en empechant tafeltree de générer des cookies j'ai réglé le
problème !

Bon, ce n'étais pas un problème PHP finalement, désolé pour le HS. Cependant
j'ai appris quelque chose aujourd'hui :o).
Publicité
Poster une réponse
Anonyme