PHP : perte des variables de session en 3G ou avec un proxy

Publié le 17 août 2009 par Jeaf

La meilleure solution et la plus sécurisée c'est d'utiliser une gestion personnalisée des sessions. Il faut écrire cela avec du PHP pur et dur en utilisant la fonction session_set_save_handler() et créer une table "sessions" en BDD.
On peut trouver les infos sur le manuel PHP ici ou un exemple plus concret et prêt à l'emploi sur le guide de sécurité PHP ici.
Cette solution demande tout de même une mise en œuvre un peu fastidieuse surtout sur du mutualisé où nous n'avons pas accès aux config de sessions par le php.ini, ni même par un .htaccess et où cette fonction peut être désactivée par l'hébergeur (chez OVH ça marche sauf avec PHP 6).
Pour les moins courageux, il existe toutefois une solution qui fonctionne chez la plupart des mutualisés en conservant la gestion native des sessions de PHP.

Nous avons tous constaté que la 3G passe par un proxy et que l'IP du visiteur change aléatoirement d'une page à l'autre (voir l'article précédent ici).
En mutu c'est un cluster qui gère la répartition des requêtes vers les stockages appropriés, le cluster peut nous balader d'un serveur à l'autre pour équilibrer les charges surtout si on change d'IP entre chaque requête. Nous ignorons chez la plupart des hébergeurs "low cost" la solution choisie pour gérer les sessions (séparément sur chaque serveur, groupées sur un /temp commun, en BDD... ?), dans la plupart des cas c'est l'adresse IP du visiteur qui est utilisée pour restituer à chacun sa session. Chez OVH par exemple, lorsqu'on change d'IP la session persiste (session ID) mais les variables ne suivent pas, puis si le proxy vous réattribue une IP précédente, hop !! vous retrouvez vos variables de sessions. Galère !!!
STOCKEZ VOS SESSIONS CHEZ VOUS et tout rentre dans l'ordre :
<?php
session_save_path($_SERVER['DOCUMENT_ROOT']."/../Sessions");
session_start();
----
?>

session_save_path("chemin_vers_dossier_Session")ou init_set("session.save_path","chemin_vers_dossier_Session")permettent de stocker les sessions dans votre espace, il faut créer un dossier "Sessions" de préférence au même niveau que www (c'est plus sur), donnez-lui un autre nom pour renforcer la discrétion ("Visites" par exemple).
Attention : ces fonctions semblent désactivées sur la version 6 de PHP chez OVH restez sur PHP 5
Cette solution rend d'ailleurs les sessions plus sures, mais pas autant que le stockage en BDD... Elle vous donne aussi la main sur le réglage de la durée si besoin.
N'oubliez pas d'insérer :
session_set_cookie_params(0, '/', '.monsite.com');pour que la même session se poursuive aussi bien sur monsite.com et www.monsite.com.
Pour plus de sécurité donnez un nom perso à vos sessions (ex: ClientDuSite) à la place du PHPSESSID par défaut, en plaçant
session_name('ClientDuSite');
Gardons bien à l'esprit que la plupart des fonctions PHP qui modifient la config de base se placent avant le session_start() et sur chaque script qui appelle une session.
Dernière précision, il faut vider régulièrement le dossier où vous stockerez vos sessions, il ne se vide pas tout seul. Lancez un "script nettoyeur" (cron, php) qui fera automatiquement le ménage tous les soirs... ou le matin.
Et que vive la 3G, tant qu'on ne me prouvera pas que les micro-ondes (ULF) utilisées donnent bien le cancer...