IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Voir le flux RSS

Architectures web hautes performances en bases de donn�es �paisses

[Actualit�] [PHP] Comment g�rer correctement les sessions applicatives en PHP et le probl�me des cookies

Note : 3 votes pour une moyenne de 1,00.
par , 14/07/2020 � 17h13 (6099 Affichages)
1. Le probl�me des cookies dans la gestion des sessions applicatives PHP

Pour aller droit au but, placer les cookies au centre de votre strat�gie de gestion des sessions PHP pour vos applications web est une tr�s mauvaise id�e et reste � proscrire. En voici les principales raisons.
- Un cookie est stock� au niveau client applicatif et donc � l'ext�rieur de l'environnement de gestion d'une application web qui se situe c�t� serveur.
- �tant dans un environnement n tiers, chaque tiers ne peut faire confiance � ce qu'il re�oit de l'autre. C'est la r�gle fondamentale � appliquer au niveau s�curitaire.
En cons�quence, ce qui est plac� du c�t� navigateur client rel�ve du domaine "public" pour votre application, ce qui ne peut �tre d�cemment consid�r� comme source de confiance pour authentifier un utilisateur au sein de votre applicatif.

Rappel : Un serveur PHP utilise d�j� un cookie en gestion interne pour authentifier un utilisateur sur le serveur web. C'est une obligation technique, il reste incontournable et reste transparent pour tout le monde. Il ne sert � rien � rajouter un cookie applicatif qui reste une aberration � la vue de ce qui pr�c�de.

Utilisez des cookies sur vos sites, � des fins marketing et de prospection, en respectant la r�glementation, est une fa�on justifi�e d'utiliser des cookies, et je vous recommande vivement de vous en tenir � cette utilisation professionnellement parlant.

2. Les besoins techniques
a. Une session PHP ne doit pas �tre trop longue
Plusieurs raisons � cela. Comme il est expliqu� dans la documentation PHP, le module de sessions PHP n'est pas prot�g� naturellement contre les attaques au niveau des sessions, notamment via javascript. Plus une session est longue, plus elle a de chances d'�tre intercept�e et utilis�e pour acc�der � des informations normalement prot�g�es.
Principe n�1
La premi�re chose donc pour limiter la surface d'attaque de nos applications en PHP, consistera � faire en sorte d'avoir des sessions relativement restreintes dans la dur�e.
Seulement dans une application web d'entreprise, les utilisateurs d�testent devoir se reconnecter 50 fois dans la m�me journ�e, surtout si le mot de passe est compliqu�. Id�alement, il faut �viter de le faire plus de 2 fois par jour. Le plus g�n�ralement constat�, apr�s discussion avec des responsables en entreprise sur les enjeux au niveau s�curit�, il est g�n�ralement souhait� une p�riode de session sans interruption comprise entre 3 et 4h.

Une des premi�res solutions se pr�sentant � nous pour r�soudre ce probl�me et atteindre ce minima de 3 � 4 heures est de jouer sur la configuration de PHP au niveau du serveur afin de repousser le timeout de connexion PHP et la p�riode du Garbage collector � cette limite. Le seul avantage est la simplicit� de gestion ici, mais voil� : les d�savantages sont tr�s nombreux. Parmi les principaux, citons :

  • La r�duction de la capacit� de monter en charge du serveur HTTP, et la r�duction drastique du nombre de connexions concurrentes pouvant �tre g�r�es par le serveur. En effet l�optimisation d�un serveur web passe avant tout par la r�duction optimale du temps de r�ponse d�un serveur � une requ�te HTTP/HTTPS afin d�en lib�rer les ressources au plus t�t et permettre � une autre requ�te de se pr�senter.
  • On ne respecte pas le principe n�1 pour r�duire la surface d�attaque de notre application.

Principe n�2
Les vieilles sessions doivent �tre maintenues jusqu'� leur prise en charge par le gc (garbage collector)
Ne pas faire ainsi s'est s'exposer � des comportements instables voire erratiques dans un contexte concurrentiel.
Principe n�3
session_regenerate_id(true) et session_destroy() ne doivent jamais �tre utilis�es ensemble pour une session active.
Ce principe est directement issu du principe pr�c�dent.
b. G�rer les sessions via un double axe au minimum : PHP + Base de donn�es et id�alement sur un axe triple : PHP + DB + Cache Redis
Une fois �limin� la solution pr�c�dente qui fait le travail certes, mais qui n'est pas satisfaisante techniquement (dans un contexte d'optimisation d'infrastructure) et surtout au niveau s�curit�, il s'impose de suite la gestion selon un axe double.

Axe double : PHP + DB
Si on souhaite garder des sessions PHP � dur�e standard dans une configuration standard par d�faut pour le moins d�un c�t� et satisfaire � notre client�le, en leur permettant de ne pas se reconnecter avant 3 � 4 heures de travail, tout en ne travaillant pas sur leur poste de travail en mode continu, mais permettre un travail effectu� par intermittence et donc avec des p�riodes d�inactivit� incluses dans ce laps de temps imparti, on n�a pas le choix :

=> On g�re la dur�e de connexion applicative en base de donn�es et on g�re les sessions techniques pour traiter les requ�tes clients sur le serveur applicatif du c�t� PHP.

On peut donc d�duire d'un tel sc�nario les �v�nements suivants :

  • Une session applicative aura plusieurs id de session PHP diff�rentes au cours de sa vie.
  • Le gc va intervenir plusieurs fois au cours de la vie de notre session applicative.
  • A chaque intervention du gc on va devoir maintenir le contenu de la session PHP
  • le gc va intervenir sur des sessions pass�es et obsol�tes ( pas de probl�me de transmission de session), et peut intervenir aussi sur la session en cours en cas de p�riode d'inactivit� trop longue de l'utilisateur (probl�me de transmission de session).


Gestion du probl�me de transmission du contenu de session
En cas de p�riode d'inactivit� trop longue de l'utilisateur, il y a un risque de perte de contenu de session, et ce, d'autant plus que la p�riode du gc fix� est faible. Il faut donc stocker le contenu s�rialis� des informations de session ailleurs que dans le syst�me de gestion de sessions de PHP et ailleurs que dans un cookie bien �videmment. Une des meilleures pratique qui est recommand�e dans la documentation de PHP est de l'�crire dans un fichier sur disque hors dossier de sessions donc.

=> L'endroit ou l'on va sauvegarder ces informations de session constitue donc le 3e axe de gestion.

Si l'on reste ici sur un paradigme PHP+DB, on devra stocker l'information en DB.

Rappel de ce qui est stock� au niveau session


  • Il n'y a pas de variable globale stock�e directement en session pour pr�server les principes de la POO.
  • On recommande donc d'y stocker des objets s�rialis�s. En g�n�ral, comme on l'a vu dans un pr�c�dent billet, il y a en a au moins 3 : une classe utilisateur, une classe connexion et une classe module applicatif.


Les donn�es de type utilisateur et connexion sont limit�es et peuvent �tre restitu�es par la base de donn�es. Il s'agit tout au plus d'une dizaine de variables selon l'applicatif concern�.
Les donn�es de type module applicatif, quant � elles, sont sp�cifiques � la navigation de l'utilisateur et de ce qu'il a fait au cours de sa session de travail. Il y aura donc dans ce type de donn�es des donn�es calcul�es sp�cifiques mises en cache. Elles sont de nature non pr�dictive et il peut �tre tr�s co�teux de les recharger � partir de la base de donn�es. Pour le moins, l'exp�rience utilisateur s'en ferait sentir dans un contexte de charge au niveau des performances applicatives, si l'on d�cidait de ne pas maintenir ces donn�es dans ce contexte de transmission de session.

On pourrait bien �videmment scinder la gestion des deux premiers types de donn�es avec le troisi�me. Dans un tel sc�nario qui obligerait � stocker en variable globale cette fois un tableau s�rialis� des modules consult�s par l'utilisateur et � g�rer sp�cifiquement leur contenu � part hors db pour �viter de la solliciter et garder une capacit� de mont�e en charge applicative optimis�e, il y aurait un surco�t de gestion applicatif au prix de quelques efforts, mais cela resterait � prototyper au niveau performances pour se faire une bonne id�e de la chose. Toujours dans un tel sc�nario, le rechargement des deux premiers types de donn�es � partir de la base, bien que tr�s limit� et localis�, provoquerait une augmentation de charge pr�judiciable � l'applicatif.

Pr�f�rer/Privil�gier une gestion � trois axes
Du plus performant au moins performant, voici les choix � privil�gier dans un tel contexte de gestion de session.

  • Sauvegarde de l'int�gralit� du cache de session (3 types de donn�es) dans REDIS

Le cache �tant tr�s rapide et g�r� en m�moire, il n'y aura pas plus performant. Attention cependant, g�rer les sessions PHP directement dans REDIS n'a rien � voir avec ce qui est expos� ici, puisque le cache de session PHP dans REDIS serait soumis aux m�mes r�gles du gc que s'il �tait g�r� de fa�on traditionnelle. Cette solution � l'avantage en plus, d'�tre transparent techniquement dans le cloud.

  • Sauvegarde de l'int�gralit� du cache de session (3 types de donn�es) sur disque

Solution � privil�gier par d�faut donc surtout lorsqu'on est pas encore � l'aise avec la gestion d'un cache sp�cifique comme REDIS.

Note
Que cela soit avec REDIS ou directement sur Disque, rien n'emp�che d'utiliser un plugin PHP de binarisation de donn�es s�rialis�es (plugin compil� sur serveur) qui apporte un gain de performances notable dans un contexte de forte charge applicative et qui a fait ses preuves, m�me si cela ajoute un traitement suppl�mentaire des donn�es concern�es. Un tel syst�me est impl�mentable sur Microsoft Azure.

2. Algorithme d'impl�mentation
Je recommande de diviser votre algorithme en deux parties distinctes. La premi�re concerne la connexion initiale de l'utilisateur, lorsqu'il se connecte � l'application. La seconde concerne le ping de connexion au moment o� une requ�te utilisateur est envoy�e au serveur (rafraichissement du navigateur, requ�te ajax, ...). On pr�f�rera travailler ainsi en mode passif (pull) sur action de l'utilisateur pour optimiser la capacit� de mont�e en charge du serveur (on lib�re les ressources au plus t�t) plut�t qu'en push, qui consomme des ressources en permanence et limite potentiellement le nombre d'acc�s concurrentiels � l'applicatif beaucoup plus vite.

Il est probable voire fortement probable (je ne l'esp�re pas) que vous soyez oblig� de mettre en place des variables de gestion qui n'existaient pas jusqu'� maintenant dans votre environnement de gestion de sessions applicatif.
Voici celles que j'impl�mente dans mes solutions et qui me paraissent incontournables et minimales.

  • datetime de connexion
  • datetime derni�re requ�te serveur
  • session_id() PHP
  • Informations navigateur utilisateur ayant initi� la connexion
  • Adresse IP utilisateur connect� ayant initi� la connexion
  • Id technique de l'utilisateur connect�
  • Les donn�es s�rialis�es � maintenir
  • La dur�e maximale de session applicative
  • La dur�e de vie configur�e de votre gc


Remarques / Conseils
Essayez de ne conserver et de g�rer au niveau des variables de gestion que le strict n�cessaire pour offrir un service de qualit� et s�curis�, tout en ayant la possibilit� d'auditer sereinement vos sessions en cas d'anomalie constat�e. Trop de volum�trie au niveau de la base a aussi ses cons�quences et ne reste pas anodine.

� vous d'impl�menter vos algorithmes

Envoyer le billet � [PHP] Comment g�rer correctement les sessions applicatives en PHP et le probl�me des cookies � dans le blog Viadeo Envoyer le billet � [PHP] Comment g�rer correctement les sessions applicatives en PHP et le probl�me des cookies � dans le blog Twitter Envoyer le billet � [PHP] Comment g�rer correctement les sessions applicatives en PHP et le probl�me des cookies � dans le blog Google Envoyer le billet � [PHP] Comment g�rer correctement les sessions applicatives en PHP et le probl�me des cookies � dans le blog Facebook Envoyer le billet � [PHP] Comment g�rer correctement les sessions applicatives en PHP et le probl�me des cookies � dans le blog Digg Envoyer le billet � [PHP] Comment g�rer correctement les sessions applicatives en PHP et le probl�me des cookies � dans le blog Delicious Envoyer le billet � [PHP] Comment g�rer correctement les sessions applicatives en PHP et le probl�me des cookies � dans le blog MySpace Envoyer le billet � [PHP] Comment g�rer correctement les sessions applicatives en PHP et le probl�me des cookies � dans le blog Yahoo

Mis � jour 16/07/2020 � 21h25 par tse_jc

Tags: cookies, php, sessions
Cat�gories
PHP , D�veloppement Web

Commentaires