Académique Documents
Professionnel Documents
Culture Documents
Le problème d'HTTP
HTTP est un protocole sans état :
ne garde aucune trace des requêtes faites au serveur
exécute chaque requête indépendamment des autres
impossible de conserver le contexte en cours !
Conservation du contexte
Problème : entre deux pages d'un même site, on a souvent besoin de conserver le contexte,
c'est-à-dire des informations sur l'internaute et ses actions
Exemples :
identification de l'internaute
statut de l'internaute (visiteur, administrateur, etc.)
son parcours dans le site
les choix effectués (panier d'achats, préférences, etc.)
Les solutions
Utiliser les paramètres d'URL pour passer les informations : limité en taille, pas très agréable
pour l'internaute, valeurs visibles dans la barre d'adresse, pas propre
Utiliser des champs cachés de formulaire POST sur chaque page : alourdit le code HTML (et
donc le poids du fichier à transférer), et ne marche pas si l'internaute quitte le site puis revient
Ces problèmes sont réglés par l'utilisation de cookies :
le serveur stocke des données chez le client dans un fichier appelé cookie
à chaque requête vers ce serveur, le client transmet les données dans l'en-tête HTTP
les cookies peuvent survivre à la déconnexion au site
Attention : aucune de ces techniques n'empêche l'internaute de modifier les données
envoyées au serveur !
https://ensweb.users.info.unicaen.fr/pres/sessions/ 1/7
11/14/2019 Cookies HTTP & sessions PHP — Alexandre Niveau — Université de Caen Normandie
Réponse du serveur
Le serveur lui envoie la page, en demandant au navigateur de créer un cookie :
HTTP/1.0 200 OK
Content-type: text/html
Set-Cookie: name=value
Set-Cookie: name2=value2; Expires=Wed, 09 Jun 2021 10:18:14 GMT
<!DOCTYPE html>
<html lang=fr>
(suite de la page…)
Le navigateur stocke les informations dans un nouveau cookie, qui restera valable jusqu'à la
date demandée
Diagramme de séquence
https://ensweb.users.info.unicaen.fr/pres/sessions/ 2/7
11/14/2019 Cookies HTTP & sessions PHP — Alexandre Niveau — Université de Caen Normandie
UI Serveur toto.fr
Internaute BD cookies
Va sur toto.fr
Ai-je un cookie
pour toto.fr ?
Non
Requête HTTP
Enregistrer blabla=12
pour toto.fr
Affichage
de la page
Requêtes suivantes
Va sur une
autre page
de toto.fr
Ai-je un cookie
pour toto.fr ?
Oui :
blabla = 12
Réponse HTTP
Affichage
de la page
Fonctionnement des cookies (lien vers l'image SVG) [img/seq_cookies.svg] (lien vers l'image PNG)
[img/seq_cookies.png]
https://ensweb.users.info.unicaen.fr/pres/sessions/ 3/7
11/14/2019 Cookies HTTP & sessions PHP — Alexandre Niveau — Université de Caen Normandie
if (key_exists('prenom', $_COOKIE))
echo "Bienvenue, " . htmlspecialchars($_COOKIE['prenom']) . " !";
Ne jamais supposer qu'un cookie existe : les navigateurs peuvent les refuser, les clients
peuvent les supprimer…
Attention aux caractères interdits dans les noms de cookie : espaces, guillemets, virgule, point-
virgule, et antislash. Peut générer des bugs difficiles à trouver.
https://ensweb.users.info.unicaen.fr/pres/sessions/ 4/7
11/14/2019 Cookies HTTP & sessions PHP — Alexandre Niveau — Université de Caen Normandie
1e requête
exécution du programme
enregistrement
des données
pour 81e8im7k
réponse
+ id de session
81e8im7k
(cookie ou URL)
2e requête
avec id de session
81e8im7k
demande des
données de l'id
81e8im7k
exécution du programme
enregistrement
des données
pour 81e8im7k
réponse
Fonctionnement d'une session PHP (lien vers l'image SVG) [img/seq_session.svg] (lien vers l'image
PNG) [img/seq_session.png]
https://ensweb.users.info.unicaen.fr/pres/sessions/ 5/7
11/14/2019 Cookies HTTP & sessions PHP — Alexandre Niveau — Université de Caen Normandie
Exemple
<?php
session_start();
// teste si l’internaute est connu ou non
if (!key_exists("nom", $_SESSION) ||
!key_exists("prenom", $_SESSION) ||
!key_exists("date", $_SESSION)) {
echo "Vous n’êtes pas identifié·e sur le site";
} else {
echo "<p>Bienvenue " . $_SESSION["prenom"] . " "
. $_SESSION["nom"] . "</p>";
echo "<p>Dernier accès : " . $_SESSION["date"] . "</p>";
$_SESSION["date"] = date("Y-m-d H:i:s");
}
// ... suite du script
?>
Sessions et objets
Les variables de session peuvent être de tout type
Elles sont sérialisées à la fin du script, de manière à pouvoir être enregistrées dans le fichier de
session du serveur sous forme de texte
Lors du chargement des données de session, elles sont donc désérialisées
Problème pour les instances de classe : PHP ne sait pas les désérialiser si la classe n'a pas été
déclarée avant
Toujours inclure les déclarations des classes utilisées avant l'appel à session_start()
Compléments
Pour supprimer une variable de session : unset (comme pour une variable normale)
https://ensweb.users.info.unicaen.fr/pres/sessions/ 6/7
11/14/2019 Cookies HTTP & sessions PHP — Alexandre Niveau — Université de Caen Normandie
Pour effacer toutes les variables de session du serveur : session_destroy() (attention, l'effet
ne sera visible qu'à la fin du script)
Il est possible de sérialiser soi-même les variables de session sous forme de chaîne, par
exemple pour les stocker dans une BD : session_encode(), session_decode()
Remarques
Par défaut, le cookie de session s'appelle PHPSESSID
Il est recommandé de changer ce nom pour une application réelle
Ceci se fait avec session_name("monsiteID");, obligatoirement avant le session_start();.
Attention : caractères alphanumériques seulement
Lecture/écriture de cookies : se fait dans l'en-tête HTTP. Donc comme pour la fonction header,
setcookie et session_start doivent être appelées avant tout envoi de contenu (même une
espace ou un saut de ligne !)
En cas d'erreur ou de warning avec «headers already sent», chercher de ce côté-là
Spécifications et normes
RFC 6265 — HTTP State Management Mechanism [http://tools.ietf.org/html/rfc6265] (référence
sur les cookies HTTP)
Références et guides
Manuel PHP sur les cookies [http://fr2.php.net/manual/fr/features.cookies.php]
Manuel PHP sur les sessions [http://fr2.php.net/manual/fr/intro.session.php]
Lectures complémentaires
HTTP cookie [http://en.wikipedia.org/wiki/HTTP_cookie] sur en.wikipedia
OWASP Session management cheat sheet
[https://cheatsheetseries.owasp.org/cheatsheets/Session_Management_Cheat_Sheet.html]
[http://creativecommons.org/licenses/by-nc-sa/4.0/]
Ce cours est mis à disposition selon les termes de la licence Creative Commons Attribution — Pas
d’utilisation commerciale — Partage dans les mêmes conditions 4.0 International
[http://creativecommons.org/licenses/by-nc-sa/4.0/].
https://ensweb.users.info.unicaen.fr/pres/sessions/ 7/7