IFT1147
Programmation Serveur Web avec PHP
Sessions et applications Web en PHP
IFT1147 - Sessions 2
Plan
Sessions - définition et théorie
Les témoins (cookies)
PHP et les sessions
Applications Web avec authentification
Sessions
Définition et théorie
IFT1147 - Sessions 4
Définition
Une session permet de sauvegarder l’état d’une application Web pour chaque usager (connexion).
L’état peut comprendre la valeur de n’importe quelle variable, comme p.e.
Le nom d’usager
Le contenu d’un panier d’achat
Les valeurs d’un formulaire
IFT1147 - Sessions 5
Pourquoi ?
Dans le protocole HTTP chaque requête est, à priori, indépendante.
Il faut donc trouver un mécanisme permettant
de sauvegarder sur le serveur Web l’état d’une connexion (i.e. ses variables)
d’inclure dans les requêtes HTTP des informations afin de retrouver l’état sur le serveur.
IFT1147 - Sessions 6
Durée de vie
Chaque session doit posséder une durée maximale puisque
L’espace disque du serveur est limité.
Le nombre d’identifiants de session est fini, donc limité.
On doit à tout prix éviter les attaques par le biais d’un identifiant de session choisi au hasard.
IFT1147 - Sessions 7
Comment ?
L’état de chaque session sera sauvegardé dans des fichiers sur le serveur Web (ou encore dans une BD).
Le navigateur envoie avec chaque requête son identificateur pour la session (sessionID). Les témoins (cookies) sont l’outil le plus fréquemment utilisé à cette fin (d’autres solutions existent).
Les témoins (cookies)
Une parenthèse pour pouvoir comprendre les sessions
IFT1147 - Sessions 9
Qu’est-ce qu’un témoin ?
Les témoins permettent de sauvegarder de l’information de façon permanente dans le navigateur.
Une fois un témoin accepté par le navigateur, celui-ci le retourne automatiquement à ce serveur Web à toutes les requêtes subséquentes.
IFT1147 - Sessions 10
Témoins et sécurité
Le navigateur n’envoie jamais un témoin à un domaine autre que celui qui l’a créé.
Un navigateur accepte un maximum de 20 témoins par domaine et leur taille peut être d’au plus 4kB chacun.
Chaque navigateur permet à l’usager de refuser les cookies et de les effacer.
IFT1147 - Sessions 11
Propriétés des témoins
Chaque témoin possède
Un nom
Une valeur
Une durée de vie
Une visibilité
Une accessibilité
Un indicateur de la sécurité
IFT1147 - Sessions 12
Durée de vie
Par défaut, le navigateur détruit le témoin quand il est fermé.
Si on veut sauvegarder une information de manière « permanente », il faut spécifier une date d’expiration (dans le futur).
Afin d’effacer un témoin, on spécifie une date d’expiration dans le passé.
IFT1147 - Sessions 13
Visibilité
Par défaut, le navigateur ne retourne que les témoins qui ont été créés par une page dans le même répertoire ou dans un sous-répertoire de la page actuellement demandée.
Le paramètre « visibilité » permet de spécifier un comportement différent.
IFT1147 - Sessions 14
Accessibilité
Par défaut, le navigateur ne retourne que les témoins qui ont été créés par le même serveur Web que la page demandée.
Le paramètre « accessibilité » permet de rendre un témoin disponible à d’autres serveurs Web à l’intérieur du même domaine.
IFT1147 - Sessions 15
L’indicateur de la sécurité
Par défaut, un témoin est transmis aussi bien par http que par https.
L’indicateur de la sécurité permet de spécifier qu’un témoin doit seulement être transmis par une connexion sécurisée.
C’est surtout utile pour des témoins dont la sécurité est très importante.
IFT1147 - Sessions 16
Requête et réception du témoin
GET /~dift1147/exemples/Cookies/nbVisites.php HTTP/1.1
Host: www-desi.iro.umontreal.ca
Referer: http://www-desi.iro.umontreal.ca/
~dift1147/exemples.php HTTP/1.x 200 OK
Date: Mon, 06 Sep 2004 12:21:23 GMT Set-Cookie: nbVisites=1
Content-Length: 4624 Connection: close
Content-Type: text/html; charset=ISO-8859-1
IFT1147 - Sessions 17
Nouvelle requête avec le témoin
GET /~dift1147/exemples/Cookies/nbVisites.php HTTP/1.1
Host: www-desi.iro.umontreal.ca
Referer: http://www-desi.iro.umontreal.ca/
~dift1147/exemples.php Cookie: nbVisites=1 HTTP/1.x 200 OK
Date: Mon, 06 Sep 2004 12:21:23 GMT Set-Cookie: nbVisites=2
Content-Length: 4624 Connection: close
Content-Type: text/html; charset=ISO-8859-1
IFT1147 - Sessions 18
PHP et les témoins
La fonction PHP permettant d’envoyer un témoin est, dans sa version la plus simple :
setcookie(nom, valeur)
Les témoins reçus sont accessibles dans le tableau associatif $_COOKIE, de façon analogue aux variables dans $_GET et dans $_POST.
IFT1147 - Sessions 19
PHP et les témoins
Comme déjà vu, l’échange des témoins se fait au niveau de l’entête HTTP.
Il est donc très important qu’aucune donnée HTML n’ait été envoyée avant que l’on fasse appel à la fonction setcookie().
Il faut absolument concevoir ses pages PHP en conséquence.
IFT1147 - Sessions 20
Bien concevoir ses pages PHP
Beaucoup de fonctions utiles (header, setcookie, session_start) agissant directement au niveau du protocole HTTP doivent être executées avant le début de l’envoi de contenu HTML.
Il faut donc toujours:
Traiter l’information avant d’afficher
PHP et les sessions
Comment la gestions des sessions est réalisée en PHP
IFT1147 - Sessions 22
PHP et les sessions
PHP, dans sa configuration standard, crée un fichier sur le disque pour chaque connexion. La valeur des variables de session y est sauvegardée.
Un cookie de nom PHPSESSID est envoyé au navigateur; il sert de clé d’accès au fichier et ainsi aux variables de session.
IFT1147 - Sessions 23
Et sans les témoins ?
PHP peut déterminer automatiquement si le navigateur accepte ou non les témoins.
Si les témoins ne sont pas acceptés, PHP peut inclure dans les formulaires et les liens locaux (pour des raisons de sécurité) un paramètre PHPSESSID afin de
transmettre l’identifiant de la session.
IFT1147 - Sessions 24
session_start()
session_start() débute une
nouvelle session ou accède à une session déjà existante.
On doit faire appel à session_start() à toutes les pages qui font partie de l’application.
session_start() envoie un témoin … on doit l’appeler au «début» de la page.
IFT1147 - Sessions 25
$_SESSION
$_SESSION est un tableau associatif qui contient toutes les variables de session.
Afin d’associer une variable avec la session, on doit l’ajouter au tableau
$_SESSION["maVar"] = $maVar;
Afin d’enlever une variable unset($_SESSION["abc"]);
IFT1147 - Sessions 26
Recette pour une session
<?php
// demarrer la session session_start();
// initialiser les variables de session if (!isset($_SESSION["nav"])) { $_SESSION["nav"]=array();
}
// utiliser les variables de session
$_SESSION["nav"][]=$_SERVER["PHP_SELF"];
// code HTML de la page
?>
IFT1147 - Sessions 27
Fin de la session
session_destroy() termine la session actuelle et efface toute trace de la session sur le disque du serveur.
PHP termine aussi automatiquement toute session après un certain temps (configurable) d’inactivité. Pour des raisons de performance, un paramètre
« probabilité de fin » existe.
IFT1147 - Sessions 28
Recette pour la fin de la session
<?php
// demarrer la session session_start();
// terminer la session session_destroy();
// code HTML de la page
?>
Il faut accéder à la session actuelle avant de pouvoir la terminer.
IFT1147 - Sessions 29
Quoi sauvegarder dans la session ?
Le tableau $_SESSION est l’endroit idéal afin de sauvegarder les informations spécifiques d’un usager:
Nom d’usager
Menus
Préférences d’affichage
IFT1147 - Sessions 30
Quoi sauvegarder dans la session ?
Il ne faut pas sauvegarder dans
$_SESSION les informations spécifiques d’une page, comme le résultat d’une recherche par exemple.
Ceci est dû au fait que rien ne garantit que l’usager n’a pas ouvert deux fenêtres de son navigateur qui font partie de la même session.
Applications Web avec authentification
Les morceaux du casse-tête se mettent en place …
IFT1147 - Sessions 32
Introduction
Pour beaucoup d’applications, il est primordial de pouvoir identifier un usager (authentification) et de pouvoir ensuite lui proposer un site adapté (session):
Commerce électronique
Transactions bancaires en ligne
…
IFT1147 - Sessions 33
La clé de la solution … - début
… est d’enregistrer une variable de session lorsque l’usager réussit l’étape de l’authentification.
On peut, en principe, se servir de n’importe quelle variable, comme
$_SESSION["login_reussi"]= true;
ou
$_SESSION["login"]= $login;
IFT1147 - Sessions 34
La clé de la solution - suite
Sur toutes les pages, on vérifie la présence de la variable de session et on redirige l’usager à la page de login si elle n’est pas présente.
Il est souvent nécessaire d’enregistrer le login de l’usager dans la session : sans cela, on est incapable de l’identifier.
IFT1147 - Sessions 35
Recette pour une application Web
<?php
//toujours demarrer session_start();
//verifier si la variable login existe if (!isset($_SESSION["login"])) { //redirection vers la page de login header("Location: login.php?
PHPSESSID={$_REQUEST["PHPSESSID"]}");
exit;
}
//suite du contenu 'normal' de la page
?>