IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Sessions et cookies en PHP


précédentsommairesuivant

III. Manipuler les sessions

III-A. Mise en garde

Les registers_globals

Attendez-vous éventuellement à des surprises de taille si les autoglobales sont activées sur votre serveur (directive register_globals mise à On dans votre fichier php.ini). Ce comportement est aujourd'hui formellement déconseillé et déprécié ! Que peut-il donc se passer ? La réponse est simple : en plus des problèmes de sécurité évidents que cette configuration peut poser, vous risquez de modifier des variables de session sans même vous en rendre compte. Illustration avec un exemple :

 
Sélectionnez
<?php
session_start();

if (ini_get('register_globals') == '1') {
    echo 'Vous devriez mettre <b>register_globals</b> à <b>Off</b><br/>';
}

$_SESSION['login'] = 'toto';
$login = 'titi';

// Affiche :
// - 'titi' avec register_globals à On donc modification, car dans CE cas
//   $_SESSION['login'] et $login représente la même variable
// - 'toto' avec register_globals à Off
echo $_SESSION['login'];
?>

À noter que le chargement des registers_globals est fait avant le début du script. Il est donc inutile de tenter de les désactiver avec ini_set(). Cependant, il est possible de le faire sur certains serveurs grâce au fichier .htaccess, grâce à la ligne ci-dessous :

.htaccess
Sélectionnez
php_flag register_globals Off

Les fonctions session_register(), session_unregister(), session_is_registered() et session_unset()

Vous pouvez trouver de nombreux tutoriels utilisant les fonctions session_register(), session_unregister(), session_is_registered().

Il ne faut plus utiliser ces fonctions. Elles appartiennent à d'anciennes versions de PHP et sont désormais dépréciées. Elles ne doivent plus être utilisées !

De même, la fonction session_unset() qui, bien qu'elle ne soit pas officiellement dépréciée, est très fortement déconseillée, car elle suit la même optique que les trois précédentes…

III-B. Débuter une session

Il existe deux façons différentes d'ouvrir une session :

  • automatique sur toutes vos pages si l'option session.auto_start est égale à 1 ou on. Cette option a pour valeur par défaut 0 ou off.
  • Extrait du fichier php.ini :
 
Sélectionnez
session.auto_start = 0 ; initialize session on request startup

Extrait du phpinfo :

Directive

Local Value

Master Value

session.auto_start

Off

Off

  • démarrage explicite et manuel de la session en utilisant la fonction session_start(). Elle permet non seulement de créer une session, mais aussi de restaurer une session via l'identifiant de session. Dans la mesure du possible, je vous recommande donc d'utiliser cette fonction pour démarrer les sessions. Elle vous permettra de récupérer la session existante ou d'en créer une si aucune session ne correspond à l'utilisateur.
    Un appel à session_start() va faire générer à PHP des en-têtes HTTP pour la réponse : il va spécifier au client qu'il ne veut pas qu'il mette la page en cache (on verra ça plus bas).
    S'il n'avait pas reçu d'identifiant de session, par cookie ou trans-id, PHP va alors générer aussi un en-tête HTTP set-cookie, pour lui passer l'identifiant qu'il viendra de générer fraichement pour nous (sauf si on désactive le cookie, voir plus bas).
    C'est pour cela, que comme on l'a expliqué plus haut avec setCookie(), session_start() doit être appelé avant toute sortie (echo, print ou autre).

° Cette fonction renvoie toujours vrai, inutile de tester son retour.

° Si vous souhaitez nommer la session, vous devez utiliser session_name() avant session_start().

° Si vous utilisez des sessions basées sur les cookies, alors il faut utiliser la fonction session_start() comme une fonction d'en-tête, c'est-à-dire que rien ne doit être affiché avant.

III-C. Sauvegarder une variable

Les variables de sessions sont, tout simplement, stockées dans le tableau super-global $_SESSION. Vous pouvez y stocker des variables de type chaîne, entier, flottant, caractère, etc. ainsi que les objets et tableaux dont les attributs ou le contenu correspondent aux types définis ci-avant (sous certaines conditions au niveau des objets notamment).

 
Sélectionnez
<?php
session_start(); // Création de la session
$_SESSION['prenom'] = 'Jean-Pierre'; // Sauvegarde dans la session créée de la variable "prenom"
?>

III-D. Récupération de données dans une session

Quand on démarre une session avec session_start(), le tableau super-global $_SESSION est automatiquement initialisé avec les variables de la session. S'il contenait quelque chose, ce contenu n'est plus disponible après.

 
Sélectionnez
<?php
echo $_SESSION['prenom'];
?>

III-E. Savoir si une variable appartient à une session

Il est utile de savoir si des variables de session sont bel et bien enregistrées dans la session. Si ce n'est pas le cas, dans le cadre d'un script d'identification, nous allons demander à l'utilisateur de s'identifier. Pour cela, nous utilisons sur le tableau $_SESSION la fonction isset() qui renvoie vrai si la variable passée en argument existe réellement. Par exemple, nous allons reprendre la même variable de session que précédemment : prenom.

 
Sélectionnez
<?php
if (isset($_SESSION['prenom'])) {
    echo 'La variable prenom est déjà enregistrée !';
    // On est certain de pouvoir y accéder ici
} else {
    echo 'La variable prenom n\'est pas enregistrée !';
}
?>

III-F. Supprimer une variable d'une session

Pour supprimer une variable, uniquement, d'une session, on utilise la fonction unset(), qui prend en paramètre la variable à détruire. Nous allons ici continuer la série d'exemples par la destruction de la variable de session prenom.

 
Sélectionnez
<?php
unset($_SESSION['prenom']); // La variable de session "prenom" a été supprimée, on ne peut plus y avoir accès !
?>

III-G. Détruire une session

La fonction session_destroy(), qui ne prend aucun paramètre et qui renvoie vrai en cas de succès et faux en cas d'erreur, est utilisée lorsque vous souhaitez vous déconnecter. Elle s'emploie donc ainsi :

 
Sélectionnez
<?php
if (session_destroy()) {
    echo 'Session détruite !';
} else {
    echo 'Erreur : impossible de détruire la session !';
}
?>

III-H. Détruire toutes les variables d'une session

Il est aussi possible de détruire toutes les variables de session, ce qui permet de conserver votre session : il suffit de réinitialiser le tableau $_SESSION.

Il ne faut jamais utiliser unset() directement sur $_SESSION, cela rendrait impossible l'accès aux variables de la session courante jusqu'à sa fermeture.

 
Sélectionnez
<?php
$_SESSION = array(); // $_SESSION est désormais un tableau vide, toutes les variables de session ont été supprimées
?>

III-I. Régénérer les identifiants de session

Il est possible de demander à PHP un nouvel identifiant de session grâce à la fonction session_regenerate_id(). Les données ne sont alors pas effacées de la session en cours. L'identifiant de session est simplement modifié, l'ancien devenant invalide. Cela est utile lorsque, par exemple, l'utilisateur change de niveau d'accès, s'il a accès à de nouvelles possibilités ou au contraire n'a plus accès à d'anciennes pages. De cette manière, si quelqu'un avait réussi à trouver l'ancien identifiant de session, il n'aura pas accès aux nouveaux privilèges de l'utilisateur.
À l'inverse, si les identifiants de sessions sont régénérés trop souvent, cela peut poser des problèmes au niveau du référencement des pages web, surtout dans les cas où ils sont passés via l'URL.


précédentsommairesuivant

Copyright © 2006 Developpez.com Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.