Introduction
Il est fort agréable d'utiliser les sessions en PHP pour sécuriser une application, toutefois il est fort gênant pour une application, de pertes des sessions pour des questions assez inexpliquées.
Bien sûr on voudrait bien que les sessions se perdent uniquement lorsqu'elles sont expirées, toutefois, la variété des réseaux et technologies du Web, fait en sorte qu'il en est vraiment souvent autrement.
Cause
Qu'est-ce qu'y peut provoquer une perte de session :
- S'il marche sur certains serveurs et pas sur d'autre, l'ajout d'une instruction «@session_start();» peut résoudre le problème.
- Délai dépassé (session expire time)
- Les Cookies sont désactivés par le navigateur Web du client
- Les Cookies ont une taille supérieure à 4 Ko
- Le disque dur du serveur est plein
- Problème matériel du serveur : disque dur sur le point de lâché, mémoire instable de la machine,...
- Changement d'IP par le navigateur Web du client (à cause d'une sécurité trop zélée, comme JanusVM, CyberGhost,...)
- Sous IE8, il est connu que beaucoup de développeurs ont éprouvé des problèmes à cause du P3P. Il faudra donc lui forcer la main de la façon suivante :
- <?php
- /* ... */
- header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"');
- ob_start();
- session_start();
- /* ... */
- ?>
- Certains administrateurs réseau développent des scripts supprimant les fichiers de sessions au bout de 3 semaines,...
- Si vous avez plusieurs serveurs avec le même site Web, et que vous constatez des pertes de sessions occasionnelles, il est possible que les sessions ne soient pas en mode «LOAD BALANCING CLUSTER». Si vous rencontrer cette situation, vous pouvez mettre les sessions en base de données ou sur un chemin TCP comme ceci pour un «memcached» dans votre «php.ini» : session.save_handler = memcache
- Nom de domaine différents : Le changement de nom de domaine et/ou «http» versus «https» peuvent provoquer des pertes de session. Vous devrez dans ce cas fixer manuellement vos «COOKIES» de la façon suivante : «session_set_cookie_params(1800,"/","monnomdedomain.com");».
- Si vous faites des synchronisations de données ou de fichiers dans le but de reproduire un environnement ou des instantané (snapshot) de VM, vous pouvez avoir aussi des problèmes de stabilité de sessions.
- ...
session.save_path = "tcp://monchemin.serveur.memcached:11211"
Si la stabilité de vos sessions sous PHP est toujours en cause après ses résolutions de problème, il est souvent préférable d'utiliser les sessions d'un cadre d'application comme CodeIgniter plutôt que ceux d'origine du PHP. Car ils sont souvent plus sécuritaires et plus stables.
Bien que, déconseillé pour la sécurité, on peut utiliser une technique semblable à celle-ci afin de forcer la conservation d'une session manuellement en passant comme paramètre URL l'identificateur de session :
- <?php
- session_start();
- session_name($_GET['PHPSESSID']);
- echo "session_id=".session_id();
- ?>
Conclusion
Les solutions les plus communes consiste à utiliser la fonction session_write_close à des endroits appropriés dans le code source PHP ou bien faire en sorte d'utiliser le même serveur uniquement pour les sessions (comme un serveur dédié). Également, le fait d'effectuer une vérification IP pour déterminé qu'il s'agit du même serveur peut considérablement réduire les risques.
Voir également
Langage de programmation - PHP - Accueil