Aller au contenu principal

Les sessions et les cookies

Notions théoriques

Sessions

Une session est un moyen de stocker des informations pour être accessibles sur plusieurs pages.

attention

Contrairement à un cookie, les sessions ne sont pas stockées sur l'ordinateur de l'utilisateur, mais côté serveur.

Lorsqu'une session est démarrée pour la première fois avec session_start(), PHP génère un identifiant de session unique. Cet identifiant est ensuite envoyé au navigateur de l'utilisateur sous la forme d'un cookie.

Lorsque l'utilisateur navigue vers une autre page sur le même site, le navigateur renvoie le cookie contenant l'identifiant de session à PHP.

PHP utilise l'identifiant de session pour retrouver les données de session associées et les rendre disponibles dans la superglobale $_SESSION.

Où sont stockées les données de session PHP ?

Les données de session associées à l'identifiant de session sont stockées côté serveur.

1) Stockage des données de session dans des fichiers

Par défaut, PHP stocke les données de session dans des fichiers sur le serveur.

L'emplacement de ces fichiers dépend de la configuration de PHP, mais l'emplacement par défaut est souvent un dossier temporaire, comme /tmp sur les systèmes Unix/Linux.

Vous pouvez trouver ou modifier l'emplacement où PHP stocke les fichiers de session en cherchant la directive session.save_path dans le fichier de configuration php.ini, ou en utilisant la fonction session_save_path() dans votre script PHP.

Voici comment vous pourriez le faire :

  • Pour trouver l’emplacement actuel dans votre script PHP :
echo session_save_path();
  • Pour définir un nouvel emplacement :
session_save_path('/chemin/vers/le/nouveau/dossier');

2) Stockage des données de session dans une base de données

Il est possible de configurer le serveur PHP pour qu'il stocke les données de session dans une base de données telles que MySQL, MariaDB, PostgreSQL etc...

3) Stockage des données de session dans un système de cache

Les principaux systèmes de cache, utilisés pour stocker les données de session de PHP son : Redis ou Memcached,

attention

Il est important de s'assurer que l'emplacement de stockage des sessions est bien sécurisé, car les données de session peuvent contenir des informations sensibles.

Il est également important de s'assurer que cet emplacement est accessible en écriture par le processus PHP.

remarque

Si les cookies sont désactivés, PHP peut transmettre l'identifiant de session dans l'URL, bien que cette méthode soit généralement évitée en raison de problèmes de sécurité potentiels.

Dans ce cas, l'identifiant de session est ajouté à l'URL de chaque lien ou formulaire sur la page.

Cookies

Un cookie est un petit fichier de données stocké sur l'ordinateur de l'utilisateur.

info

Les cookies sont généralement utilisés pour conserver la trace des visiteurs et des préférences de l'utilisateur pour une certaine période de temps.

Pour créer un cookie en PHP, on utilise la fonction setcookie().

attention

La fonction setcookie() doit être appelée avant toute sortie HTML.

En PHP, pour récupérer la valeur d'un cookie, on utilise la superglobale $_COOKIE.

Sessions vs cookies

Il est important de noter que les cookies et les sessions ont des utilisations différentes et complémentaires.

  • Les cookies sont idéaux pour stocker des informations non sensibles entre les visites (comme les préférences de l'utilisateur),
  • tandis que les sessions sont mieux adaptées pour stocker des informations temporaires qui sont sensibles ou spécifiques à une seule visite (comme les informations d'authentification de l'utilisateur).
Comment peut-on détruire une session en PHP ?
  • Pour détruire une session en PHP, on utilise session_destroy().
  • Avant de l'appeler, il faut s'assurer que la session est démarrée avec session_start().
  • Ensuite, on appelle la fonction session_destroy() qui va supprimer toutes les données associées à la session en cours.
  • Si on veut également supprimer le cookie de session, on doit supprimer le cookie de session avec setcookie().
Comment supprimer un cookie en PHP ?

Pour supprimer un cookie en PHP, il existe 2 approches :

Méthode recommandée : setcookie() avec une date d'expiration passée

La méthode la plus efficace et largement utilisée consiste à utiliser la fonction setcookie() en définissant une date d'expiration dans le passé :

setcookie("nom_du_cookie", "", time() - 3600);

Cette méthode fonctionne de la manière suivante :

  • Elle définit la valeur du cookie à une chaîne vide.
  • Elle fixe la date d'expiration à une heure dans le passé (time() - 3600).
  • Le navigateur, constatant que la date d'expiration est dépassée, supprimera automatiquement le cookie.

Pour une suppression plus complète, vous pouvez également spécifier le chemin et le domaine si ceux-ci ont été définis lors de la création du cookie :

setcookie("nom_du_cookie", "", time() - 3600, "/", "example.com");

Méthode complémentaire : unset()

Bien que unset() ne supprime pas réellement le cookie du navigateur, il peut être utile de l'utiliser en complément pour effacer la valeur du cookie de la superglobale $_COOKIE pour la durée du script en cours :

unset($_COOKIE['nom_du_cookie']);

Bonne pratique

Pour une suppression efficace et complète d'un cookie, il est recommandé de combiner les deux approches :

setcookie("nom_du_cookie", "", time() - 3600, "/");
unset($_COOKIE['nom_du_cookie']);

Cette combinaison assure que le cookie est supprimé du navigateur et que sa valeur n'est plus accessible via $_COOKIE dans le script en cours d'exécution.

attention
  • Il est important de noter qu'il n'existe pas de fonction native deleteCookie() ou unsetCookie() en PHP.

  • La méthode utilisant setcookie() avec une date d'expiration passée est la façon standard de supprimer un cookie en PHP.

Quelle est la différence en PHP entre session_close() et session_destroy() ?

En PHP, il existe une différence importante entre session_close() et session_destroy() :

session_close()

  • Termine la session en cours et sauvegarde les données de session.
  • Ne supprime pas les données de session, elles restent disponibles pour une utilisation ultérieure[2].
  • Libère les ressources utilisées par la session.

session_destroy()

  • Détruit complètement toutes les données associées à la session en cours.
  • Supprime le fichier de session contenant les informations de session.
  • Ne désactive pas les variables globales associées à la session ni le cookie de session.

Principales différences :

  • session_close() termine simplement la session active, tandis que session_destroy() supprime toutes les données de session.
  • Après session_close(), les données de session sont toujours accessibles lors de la prochaine session.
  • Après session_destroy(), toutes les données sont perdues.
  • session_destroy() est plus radical et généralement utilisé lors d'une déconnexion complète.

Il est important de noter que session_destroy() à lui seul ne suffit pas toujours pour une déconnexion complète. Pour une déconnexion totale, il est recommandé d'utiliser une combinaison de fonctions comme session_unset(), session_destroy() et de supprimer le cookie de session.

Comment réouvrir une session après un session_close ?

Dans la plupart des cas, un simple appel à session_start() suffira pour réouvrir la session après un session_close().

astuce

Si vous voulez éviter les avertissements "headers already sent", vous pouvez utiliser la fonction session_start() avec des options spécifiques :

session_start([
'read_and_close' => true
]);

Cette option permet de lire les données de session sans verrouiller le fichier de session, ce qui est utile si vous avez besoin d'accéder aux données de session sans les modifier.

remarque

Réouvrir une session ne nécessite pas de renvoyer le cookie de session, car celui-ci est déjà présent dans le navigateur du client.

Exemples pratiques

Session

Créons une session simple en PHP et stockons une information dedans :

<?php
// Démarrage de la session
session_start();

// Stockage d'une information dans la session
$_SESSION["nom"] = "Dupont";
?>

Et maintenant, récupérons cette information dans une autre page :

<?php
// Démarrage de la session
session_start();

// Récupération de l'information stockée dans la session
print("Bonjour, " . $_SESSION["nom"]);
?>
Comment tester ce code ?

Pour tester ce code, il suffir de

  1. créer 2 fichiers PHP :
  • 1 fichier PHP (par exemple session1.php) pour créer une session et stocker le nom de l'utilisateur :
<?php
// Démarrage de la session
session_start();

// Stockage d'une information dans la session
$_SESSION["nom"] = "Dupont";
?>
  • 1 fichier PHP (par exemple session2.php) pour récupérer le nom de l'utilisateur stocké dans la session :
<?php
// Démarrage de la session
session_start();

// Récupération de l'information stockée dans la session
print("Bonjour, " . $_SESSION["nom"]);
?>
  1. démarrer le serveur Web intégré à PHP avec la commande php -S localhost:8000

  2. ouvrir la 1ère page avec le navigateur Web : http://localhost:8000/session1.php

  3. ouvrir la 2ème page avec le navigateur Web : http://localhost:8000/session2.php

  4. constater que le nom de l'utilisateur a bien été stocké dans la session

Voici comment on peut créer un cookie en PHP :

<?php
// Création d'un cookie qui expire dans une heure
setcookie("couleur_preferee", "bleu", time() + 3600);
?>

Et voici comment le récupérer :

<?php
// Récupération de la valeur du cookie
if(isset($_COOKIE["couleur_preferee"])) {
print("Votre couleur préférée est : " . $_COOKIE["couleur_preferee"]);
}
?>

Comment consulter les informations des cookies ?

Les données des cookies sont stockées dans le navigateur.

Google Chrome

  1. Ouvrez Google Chrome.
  2. Cliquez sur les trois points verticaux en haut à droite de la fenêtre du navigateur pour ouvrir le menu.
  3. Sélectionnez "Plus d'outils", puis "Outils de développement" (ou utilisez le raccourci clavier Ctrl+Shift+I ou la touche F12 sur Windows, ou Command+Option+I sur Mac).
  4. Dans les outils de développement, cliquez sur l'onglet "Application".
  5. Dans le volet de gauche, sous "Stockage", cliquez sur "Cookies". Vous verrez une liste des sites Web pour lesquels des cookies sont stockés. Cliquez sur un site Web pour voir les cookies spécifiques à ce site.

Mozilla Firefox

  1. Ouvrez Mozilla Firefox.
  2. Cliquez sur les trois lignes horizontales en haut à droite de la fenêtre du navigateur pour ouvrir le menu.
  3. Sélectionnez "Développement Web", puis "Inspecteur" (ou utilisez le raccourci clavier Ctrl+Shift+C ou la touche F12 sur Windows, ou Command+Option+C sur Mac).
  4. Dans les outils de développement, cliquez sur l'onglet "Stockage".
  5. Dans le volet de gauche, sous "Cookies", vous verrez une liste des sites Web pour lesquels des cookies sont stockés. Cliquez sur un site Web pour voir les cookies spécifiques à ce site.

Safari

  1. Ouvrez Safari.
  2. Dans la barre de menu en haut de l'écran, cliquez sur "Safari", puis sur "Préférences".
  3. Dans la fenêtre des préférences, cliquez sur "Confidentialité".
  4. Cliquez sur "Gérer les données du site Web". Vous verrez une liste des sites Web pour lesquels des données, y compris des cookies, sont stockés.
Comment consulter les informations des sessions ?

Les données de session sont stockées côté serveur, ce qui signifie qu'elles ne sont pas accessibles depuis le navigateur comme les cookies. Cependant, l'ID de session est généralement stocké dans un cookie sur le navigateur de l'utilisateur, ce qui permet au serveur d'associer une session à un utilisateur spécifique.

Pour voir l'ID de session dans votre navigateur, vous pouvez généralement suivre les mêmes étapes que pour voir les cookies, et chercher un cookie dont le nom est : PHPSESSID (avec PHP). L'ID de session sera la valeur de ce cookie.

Cependant, pour voir les données réelles associées à la session, vous auriez besoin d'accès au serveur. Dans PHP, les données de session sont généralement stockées dans des fichiers sur le serveur. L'emplacement exact de ces fichiers peut varier en fonction de la configuration de votre serveur, mais l'emplacement par défaut est généralement un répertoire appelé tmp ou session.

astuce

Avec PHP, les données de session sont stockées dans le répertoire spécifié par la directive session.save_path dans le fichier de configuration php.ini.

Le chemin par défaut est généralement le répertoire des fichiers temporaires. Sur un système Windows, vous pouvez connaître le chemin de ce répertoire avec la commande echo %TEMP%

Si les données de session sont stockées dans un fichier, son nom commence souvent par sess_ suivi par l'ID de session PHPSESSID.

Voici par exemple le contenu du fichier sess_2okidihjssr9bv902rjkgfecjb :

language|s:6:"french";

Veuillez noter que ces fichiers de session sont parfois stockés dans un format sérialisé, donc ils peuvent ne pas être facilement lisibles.

Test de mémorisation/compréhension


Comment démarre-t-on une session en PHP ?


Quelle superglobale permet de stocker et récupérer des informations de session ?


Comment crée-t-on un cookie en PHP ?


Quelle superglobale permet de récupérer la valeur d'un cookie ?


Les sessions sont-elles stockées sur le serveur ou sur le client ?


Comment PHP transmet-il l'identifiant de session si les cookies sont désactivés ?


Quelle fonction PHP est utilisée pour démarrer une nouvelle session ?


Quelle superglobale PHP est utilisée pour récupérer les données d'une session ?


Quel est le risque principal de la transmission de l'identifiant de session dans l'URL ?



TP - Création d'une session

Dans ce TP, vous allez créer une application Web simple qui utilise les sessions pour enregistrer le choix de l'utilisateur concernant la langue du site Web.

Lorsque l'utilisateur sélectionne une langue, cette information est stockée dans une session et utilisée pour afficher le site dans la langue choisie lors de ses visites ultérieures.

  • Dans votre répertoire "Documents" créez le répertoire tp_sessions.
  • Dans ce répertoire créez le fichier index.php :
    <!DOCTYPE html>
    <html>
    <body>

    <h2>Choisissez votre langue</h2>

    </body>
    </html>
  • Dans ce répertoire créez aussi le fichier set_language.php.
  • Démarrez le serveur Web intégré à PHP :
    php -S localhost:8000
  • Testez le fonctionnement de ce fichier, dans votre navigateur, à l'adresse :
    http://localhost:8000

Étape 1 : Création du formulaire

Dans le fichier index.php ajoutez un formulaire permettant à l'utilisateur de choisir sa langue préférée. Le formulaire doit avoir deux options : Français et Anglais.

<!DOCTYPE html>
<html>
<body>

<h2>Choisissez votre langue</h2>

<form action="set_language.php" method="post">
<input type="radio" id="french" name="language" value="french">
<label for="french">Français</label><br>
<input type="radio" id="english" name="language" value="english">
<label for="english">Anglais</label><br>
<input type="submit" value="Submit">
</form>

</body>
</html>

Étape 2 : Stockage de la langue dans une session

Dans le fichier set_language.php

  • récupèrez la langue choisie par l'utilisateur
  • et stockez la dans une session.
<?php
session_start();

if (isset($_POST['language'])) {
$_SESSION['language'] = $_POST['language'];
}

header('Location: index.php');
?>

Étape 3 : Affichage de la langue choisie

Modifiez le fichier index.php pour qu'il affiche la langue choisie par l'utilisateur s'il y en a une stockée dans la session.

<?php
session_start();
?>

<!DOCTYPE html>
<html>
<body>

<h2>Choisissez votre langue</h2>

<form action="set_language.php" method="post">
<input type="radio" id="french" name="language" value="french">
<label for="french">Français</label><br>
<input type="radio" id="english" name="language" value="english">
<label for="english">Anglais</label><br>
<input type="submit" value="Submit">
</form>

<p>
Votre langue actuelle est :
<?php
if (isset($_SESSION['language'])) {
$_SESSION['language'] == 'french' ? 'Français' : 'Anglais';
print($_SESSION['language']);
}
?>
</p>

</body>
</html>
remarque

La ligne de code :

$_SESSION['language'] == 'french' ? 'Français' : 'Anglais';

fait appel à l'opérateur ternaire.

Pour en savoir plus : https://www.php.net/manual/fr/language.operators.comparison.php#language.operators.comparison.ternary

Version avec un if
<p>
Votre langue actuelle est :
<?php
if (isset($_SESSION['language'])) {
if ($_SESSION['language'] == 'french') {
print('Français');
}
else {
print('Anglais');
}
}
?>
</p>
Version avec un switch case

Lorsqu'il y a plus de 2 langues, il est conseillé d'utiliser un switch case

<p>
Votre langue actuelle est :
<?php
if (isset($_SESSION['language'])) {
switch ($_SESSION['language']) {
case 'french':
print('Français');
break;
case 'english':
print('Anglais');
break;
}
}
?>
</p>

Avec ces étapes, vous avez créé une application simple qui utilise les sessions pour mémoriser la préférence de langue de l'utilisateur.

astuce

Vous pouvez étendre cette application pour qu'elle affiche réellement le contenu du site dans la langue choisie.


Créez une petite application Web qui permet à un utilisateur de choisir sa couleur préférée.

La couleur choisie par l'utilisateur sera ensuite :

  • stockée dans un cookie
  • et utilisée pour colorer le fond de la page à chaque visite de l'utilisateur.

  • Dans votre répertoire "Documents" créez le répertoire tp_cookies.

  • Dans ce répertoire créez le fichier index.php :

    <body>
    <h1>Bienvenue sur notre site !</h1>
    <p><a href="set_color.php">Choisir une autre couleur</a></p>
    </body>
  • Dans ce répertoire créez aussi le fichier set_color.php.

  • Démarrez le serveur Web intégré à PHP :

    php -S localhost:8000
  • Testez le fonctionnement de ce fichier, dans votre navigateur, à l'adresse :

    http://localhost:8000
  • Dans votre fichier set_color.php, créez un formulaire pour que l'utilisateur puisse choisir sa couleur.

    Pour vous aider voici un exemple possible de formulaire pour le choix de la couleur :

    <form method="post">
    <label for="couleur">Choisissez votre couleur préférée :</label>
    <input type="color" id="couleur" name="couleur">
    <button type="submit">Valider</button>
    </form>
  • Dans votre fichier index.php, avant le formulaire HTML, mémoriser la couleur dans la variable $couleur :

    <?php
    $couleur = "#FFFFFF"; // Couleur par défaut (blanc)

    if (isset($_COOKIE["couleur_preferee"])) {
    $couleur = $_COOKIE["couleur_preferee"];
    }
    ?>
  • Dans votre fichier index.php, définissez le style background-color afin que la couleur choisie soit bien visible.

    Voici un exemple possible de code pour définir la couleur du fond de la page :

    <head>
    <style>
    body {
    background-color: <?php print($couleur); ?>;
    }
    </style>
    </head>
  • Testez le fonctionnement de votre projet, dans votre navigateur :

Une solution