Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. PHP 8
  3. Gérer les sessions
Extrait - PHP 8 Développez un site web dynamique et interactif (2e édition)
Extraits du livre
PHP 8 Développez un site web dynamique et interactif (2e édition) Revenir à la page d'achat du livre

Gérer les sessions

Description du problème

Le protocole HTTP (HyperText Transfer Protocol) est un protocole "sans état" : rien ne permet d’identifier que c’est le même utilisateur qui était précédemment sur la page A et qui, maintenant, accède à la page B.

En ce qui concerne PHP, nous savons maintenant qu’une variable a une portée égale au script dans lequel elle est définie, et qu’elle existe uniquement le temps de l’exécution du script.

Or, un site interactif qui ne se contente pas d’afficher des pages les unes derrière les autres, a souvent besoin, du point de vue de la logique applicative, d’identifier un utilisateur d’une page à l’autre et de conserver des informations relatives à cet utilisateur d’une page à l’autre (typiquement, un panier électronique constitué par l’utilisateur sur une page doit toujours être défini sur la page permettant le paiement).

Le terme "session" désigne la période de temps correspondant à la navigation continue d’un utilisateur sur un site. "Gérer les sessions" signifie donc être en mesure d’identifier l’instant où un nouvel utilisateur accède à une page du site et de conserver des informations relatives à cet utilisateur jusqu’à ce qu’il...

Authentification

1. Vue d’ensemble

Certains sites ont besoin d’authentifier les utilisateurs qui accèdent au site afin de vérifier que ces derniers sont bien inscrits.

Cette authentification comprend généralement deux étapes :

  • Saisie par l’utilisateur d’informations d’identification, typiquement un nom et un mot de passe.

  • Vérification que l’identification saisie correspond bien à un utilisateur inscrit.

2. Saisie de l’identification

L’identification peut être saisie de deux manières :

  • Par l’intermédiaire d’un formulaire prévu à cet effet.

  • Par les fonctions d’authentification HTTP.

a. Identification par formulaire

Il est très simple de créer un petit formulaire permettant à l’utilisateur de saisir un nom et un mot de passe.

Exemple de script PHP (login.php) qui affiche ce formulaire (fonction de vérification utilisateur_existe, pour l’instant non définie)

<?php 
// Inclusion du fichier contenant les fonctions générales. 
include('fonctions.inc'); 
// Fonction qui vérifie que l'identification saisie  
// est correcte. 
function utilisateur_existe($identifiant,$mot_de_passe) { 
   // Aléatoire, en attendant mieux... 
   return (bool) rand(0,1); 
} 
// Initialisation des variables. 
$identifiant = ''; 
$mot_de_passe = ''; 
$message = ''; 
// Traitement du formulaire. 
if (isset($_POST['connexion'])) { 
   // Récupérer les information saisies. 
   $identifiant = $_POST['identifiant']; 
   $mot_de_passe = $_POST['mot_de_passe']; 
   // Vérifier que l'utilisateur existe. 
   if (utilisateur_existe($identifiant,$mot_de_passe)) { 
      // L'utilisateur existe... 
      // Partir sur une autre page et interrompre  
      // le script. 
      header('location: accueil.php'); 
      exit; 
   } else { 
      // L'utilisateur n'existe pas... 
      // Afficher un message...

Utiliser des cookies

1. Principe

Un cookie est un petit fichier déposé par un site sur le poste de l’internaute et qui peut contenir des informations.

Les cookies sont automatiquement renvoyés au serveur web par le navigateur lorsque l’internaute navigue dans les pages du site en question.

PHP permet de récupérer très facilement, dans des variables, les données stockées dans le cookie.

La fonction setcookie permet de déposer un cookie sur le poste de l’internaute.

Syntaxe 1

booléen setcookie(chaîne nom [, chaîne valeur [, entier expiration [, chaîne chemin 
[, chaîne domaine [, booléen securisé[, booléen http_uniquement]]]]]]) 

Avec :

nom

Nom du cookie.

valeur

Valeur stockée dans le cookie.

expiration

Date d’expiration du cookie (timestamp Unix).

chemin

Chemin sur le serveur dans lequel le cookie est disponible. Mettre / pour rendre le cookie disponible sur le domaine entier ou /rep/ pour rendre le cookie disponible dans le répertoire /rep/ du domaine et tous ses sous-répertoires. Par défaut, égal au répertoire à partir duquel le cookie a été déposé.

domaine

Domaine auquel le cookie est renvoyé. .monSite.com (avec un point au début) permet par exemple de rendre le cookie disponible pour tous les sous-domaines de monSite.com.

sécurisé

Mettre TRUE pour indiquer que le cookie ne doit être transmis que sur une connexion sécurisée (FALSE par défaut).

http_uniquement

Mettre TRUE pour indiquer que le cookie ne doit être transmis que pour le protocole HTTP (FALSE par défaut).

Syntaxe 2

booléen setcookie(chaîne nom [, chaîne valeur [, tableau options]]) 

nom

Nom du cookie.

valeur

Valeur stockée dans le cookie.

options

Tableau associatif qui permet de passer les options du cookie. Les clés autorisées sont expires (date d’expiration), path (chemin sur le serveur dans lequel le cookie est disponible), domain (domaine auquel le cookie est renvoyé), secure (indique si le cookie ne doit être transmis que sur une connexion sécurisée), httponly (indique si le cookie ne doit être transmis que pour le protocole HTTP) et samesite. Les valeurs autorisées pour la clé samesite sont Strict (cookie renvoyé...

Utiliser la gestion des sessions de PHP

1. Principes

PHP propose un ensemble de fonctions qui facilitent la gestion des sessions. Les principes sont les suivants :

  • Un identifiant unique est automatiquement attribué à chaque session.

  • Cet identifiant unique est transmis d’une page à l’autre, soit par cookie (si le poste accepte les cookies), soit par l’URL dans le cas contraire ; en tout état de cause, c’est PHP qui choisit automatiquement la bonne méthode et assure ce transfert (à quelques réserves près, liées à la configuration).

  • Les données dont vous souhaitez conserver la valeur d’une page à l’autre pendant la durée de la session, sont indiquées à PHP qui se charge automatiquement de restituer leurs valeurs au début du script et de les sauvegarder à la fin du script.

En bref, PHP se charge de toute la gestion.

2. Mise en œuvre

Les principales fonctions du module de gestion des sessions sont les suivantes :

Nom

Rôle

session_start

Ouvre une nouvelle session ou réactive la session courante.

session_id

Retourne (ou éventuellement modifie) l’identifiant de la session.

session_name

Retourne (ou éventuellement modifie) le nom de la variable utilisée pour stocker l’identifiant de la session.

session_abort

Annule les modifications apportées aux données de session et termine la session.

session_reset

Réinitialise les données de session à leurs valeurs initiales. 

session_destroy

Supprime la session.

session_status

Retourne le statut actuel d’une session.

En complément, le tableau $_SESSION permet de manipuler très facilement les données de session.

session_start

Syntaxe

booléen session_start([tableau options]) 

options

Tableau associatif qui permet de définir des options qui vont remplacer les directives de configuration relatives aux sessions (les clés sont égales aux noms des directives sans le préfixe session.).

La fonction session_start va interroger l’environnement pour détecter si une session a déjà été ouverte pour l’utilisateur actuel. Si oui, les variables enregistrées dans la session sont restituées. Autrement, une nouvelle session est ouverte avec attribution d’un identifiant....

Conserver des informations d’une visite à une autre

Si vous souhaitez conserver des informations sur un utilisateur d’une visite à l’autre (éventuellement très éloignées dans le temps), il existe deux solutions prédominantes :

  • Déposer un cookie sur son poste (de préférence avec son accord préalable).

  • Stocker les informations côté serveur (le plus pratique étant d’utiliser une base de données), et associer ces informations à une identification (typiquement un nom et un mot de passe) que l’utilisateur devra saisir à chaque visite.

Une solution intermédiaire, élégante et respectueuse de l’utilisateur, est employée par certains sites ; cette solution consiste à proposer à l’utilisateur de déposer sur son poste un cookie qui ne contient qu’une ou deux informations permettant la connexion automatique au site (sans saisir de nom et de mot de passe), les informations complémentaires étant récupérées dans une base.

Nous allons illustrer cette solution à l’aide de deux pages :

  • Une page de personnalisation (script personnaliser.php) qui permet à l’utilisateur d’activer ou de désactiver la connexion automatique.

  • Une page d’identification (script login.php) qui, selon le cas, effectue la connexion automatique ou demande à l’utilisateur de se connecter.

Chaque connexion de l’utilisateur est une session.

Source

  • Script personnaliser.php :

<?php 
// Inclusion du fichier contenant les fonctions générales. 
include('fonctions.inc'); 
// Ouvrir/réactiver la session. 
session_start(); 
// Initialisation des variables. 
$message = ''; 
// La session a-t-elle été ouverte au niveau applicatif ? 
if (isset($_SESSION['identifiant'])) { // oui 
  // Récupérer les informations de session. 
  $identifiant = $_SESSION['identifiant']; 
  $mot_de_passe = $_SESSION['mot_de_passe']; 
  // Le script est-il appelé en traitement du formulaire ? 
  if (isset($_POST['activer'])) { // oui 
    // Activer la connexion automatique. 
    // Déposer...

Petite synthèse sur les variables Get/Post/Cookie/Session

Depuis le début de cet ouvrage, nous avons rencontré des variables "particulières", celles associées à des données de formulaire, à des données transmises par une URL, à des données d’un cookie ou encore, à des données de sessions.

Nous avons vu que ces variables fonctionnaient selon le même principe : elles sont accessibles par l’intermédiaire de tableaux associatifs $_GET, $_POST, $_COOKIE et $_SESSION. En complément, le tableau associatif $_REQUEST regroupe le contenu des tableaux $_GET, $_POST et $_COOKIE.

Le tableau $_REQUEST doit être utilisé avec précaution car il contient des données fournies au script par plusieurs mécanismes ; nous ne sommes donc pas forcément certains que l’information lue arrive bien par le moyen attendu.

Le fait que les tableaux $_GET, $_POST et $_COOKIE soient effectivement créés dépend de la directive de configuration variables_order.

Cette directive est une chaîne composée des caractères G, P et C correspondant aux types déjà évoqués, et de deux autres caractères, E, correspondant aux variables d’environnement, et S correspondant aux variables du serveur HTTP. Par défaut, la directive variables_order est égale à EGPCS.

Les variables d’environnement du système...