Karkov
2008-09-25 10:48:38 UTC
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=fakeentry"
=========
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=97
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=96
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
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=fakeentry"
=========
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=97
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=96
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