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...