begin process at 2012 02 04 22:50:25
  Trouver un code source :
 
dans
 
Accueil > 

Tutoriels

 > 

Tutoriaux

 > LES SESSIONS PHP, COMMENT ÇA MARCHE ?

LES SESSIONS PHP, COMMENT ÇA MARCHE ?


 Information sur le tutoriel

Note :
9,14 / 10 - par 7 personnes
9,14 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

 Description

Depuis PHP4, on entend beaucoup parler de sessions. De nombreuses personnes utilisant PHP ignorent encore ce que c'est et à quoi elles servent. D'autres, en revanche, ne savent pas les utiliser à bon escient. Ce tutoriel est une approche à la fois théorique et pratique des sessions. Elles seront présentées au moyen d'un exemple simple tout au long de ce billet. Il s'agit d'un espace de site sécurisé par authentification.

Tutorial

Une session c'est quoi ?

Une session est un mécanisme technique permettant de sauvegarder temporairement sur le serveur des informations relatives à un internaute. Ce système a notamment été inventé pour palier au fait que le protocole HTTP agit en mode non connecté. A chaque ouverture de nouvelle session, l'internaute se voit attribuéun identifiant de session. Cet identifiant peut-être transmis soit enGET (PHPSESSID ajouté à la fin de l'url), POST ou Cookie (cookie surposte client) selon la configuration du serveur. Les informationsseront quant à elles transférées de page en page par le serveur et nonpar le client. Ainsi, la sécurité et l'intégrité des données s'envoient améliorées ainsi que leur disponibilité tout au long de lasession. Une session peut contenir tout type de données : nombre,chaîne de caractères et même un tableau.

Contrairement à une base de données ou un système de fichiers, lasession conserve les informations pendant quelques minutes. Cette duréedépend de la configuration du serveur mais est généralement fixée à 24minutes par défaut. Le serveur crée des fichiers stockés dans unrepertoire temporaire.

Parmi les utilisations les plus courantes des sessions, on trouve :

  • Les espaces membres et accès sécurisés avec authentification
  • Gestion d'un caddie sur un site de vente en ligne
  • Formulaires éclatés sur plusieurs pages
  • Stockage d'informations relatives à la navigation de l'utilisateur (thème préféré, langues...)

La théorie, c'est bien beau mais en pratique comment ça se passe ? Le chapitre suivant explique l'initialisation et la restauration d'une session ouverte.

Initialisation (et restauration) d'une session

PHP introduit nativement une unique fonction permettant de démarrer ou de continuer une session. Il s'agit de session_start(). Cette fonction ne prend pas de paramètre et renvoit toujours true. Elle vérifie l'état de la session courante. Si elle est inexistante, alors le serveur la crée sinon elle la poursuit.

<?php
session_start();
?>

Dans le cas d'une utilisation des sessions avec les cookies, lafonction session_start() doit obligatoirement être appellée avant toutenvoi au navigateur sous peine de voir afficher les fameuses erreurs :

"Cannot modify header information - headers already sent by ..." ou "Cannot send session cookie - headers already sent by ...".Cela est du au fait que PHP ne peut plus envoyer de cookie àl'utilisateur car il y'a déjà eu une sortie au navigateur (echo(),print(), espace blanc, tag html...).

Note : il faut appeller session_start() sur chaque page utilisant le système de session.

Lecture et ecriture d'une session

Le tableau $_SESSION

Lorsqu'une session est créée, elle est par défaut vide. Elle n'a donc aucun intérêt. Il faut donc lui attribuer des valeurs à sauvegarder temporairement. Pour cela, le langage PHP met en place le tableau superglobal $_SESSION. Le terme superglobal signifie que le tabeau a une visibilité maximale dans les scripts. C'est à dire que l'on peut y faire référence de manière globale comme locale dans une fonction utilisateur sans avoir à le passer en paramètre. Le tableau $_SESSION peut-être indexé numériquement mais aussi associativement. En règle générale, on préfère la seconde afin de pouvoir donner des noms de variables de sessionclairs et porteurs de sens.

L'écriture de session

Pour enregistrer une nouvelle variable de session, c'est toutsimple. Il suffit juste d'ajouter un couple clé / valeur au tableau$_SESSION comme l'illustre l'exemple suivant.

<?php

// Démarrage ou restauration de la session
session_start();

// Ecriture d'une nouvelle valeur dans le tableau de session
$_SESSION['login'] = 'Dupond';

?>

		

Le tableau $_SESSION, qui était vide jusqu'à présent, s'est agrandit dynamiquement et contient maintenant une valeur (Dupond) à la clé associative login. Une variable de session est alors créée.

Note de rappel : à place de la chaîne de caractères «Dupond»,nous aurions pu mettre un nombre, un booléen ou encore un tableau parexemple.

Lecture d'une variable de session

Après l'écriture, c'est au tour de la lecture. Il n'y a rien deplus simple. Pour lire la valeur d'une variable de session, il fauttout simplement appeler le tableau de session avec la clé concernée. L'exemple ci-dessous illustre tout ça.

<?php

// Démarrage ou restauration de la session
session_start();

// Lecture d'une valeur du tableau de session
echo $_SESSION['login'];

?>

										

Cette instruction aura pour effet d'afficher à l'écran la chaîne de caractères Dupond.

Destruction d'une session

Comme cela a été évoqué plus haut, le serveur détruit lui même lasession au bout d'un certain temps si la session n'a pas étérenouvellée. En revanche, il est possible de forcer sa destruction grâce à la fonction session_destroy(). Cela permet par exemple aux webmasters de proposer une page dedéconnexion aux membres loggués à leur espace personnel. Cependant, l'utilisation de session_destroy() seule n'est pas très "propre". Le code suivant présente une manière plus correcte de mettre fin à une session.

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

// Réinitialisation du tableau de session
// On le vide intégralement
$_SESSION = array();

// Destruction de la session
session_destroy()

// Destruction du tableau de session
unset($_SESSION);

?>

Pour être convaincu de la destruction de la session, il suffitjuste d'essayer d'afficher le contenu du tableau de session au moyen dela fonction print_r().

Configuration des sessions sur le serveur

Une session ne reste ouverte que pendant un certain temps. Tout au plus ce sera celle indiquée par la directive session.gc_maxlifetime du php.ini, entre deux clics consécutifs du client. Il est recommandé de ne pas augmenter la valeur inscrite par défaut. Mais pourquoi ? Toutsimplement parceque si la session à une durée de vie plus importante,on s'expose à des risques de piratage par vol de session notamment (cf: voir les liens annexes en fin de billet pour plus d'informations).

Pour les mêmes raisons de sécurité, il est conseillé de configurer le serveur de la façon suivante :

session.use_cookies 1
session.use_only_cookies 1

session.use_trans_sid 0

Cette configuration implique néanmoins une restriction totale pourles personnes n'acceptant pas les cookies. Ci-dessous, la significationdans le même ordre des 3 lignes de configuration précédentes.

  • L'identifiant de session est transmis par un cookie.
  • Seul le cookie peut transmettre l'identifiant de session.
  • Le PHPSESSID transmis dans l'url est strictement refusé.

Approche pratique : concevoir un accès restreint

Présentation du cas pratique

Le présent chapitre introduit un cas concret d'utilisation dessessions. Il s'agit d'un accès restreint basique. Seul un utilisateurn'est autorisé à être loggué mais cet exemple est à la base de lacréation d'un espace membre. C'est exactement la même chose. Pourréaliser tout ça, nous aurons besoin de 2 fichiers : le formulaireaccompagné de son script de login, et la page protégée. Commençons parle formulaire de login. Le code étant commenté, il n'y aura pas plusd'explications.

Formulaire d'authentification : authentification.php

<?php

    // Definition des constantes et variables
    define('LOGIN','toto');
    define('PASSWORD','tata');
    $errorMessage = '';

    // Test de l'envoi du formulaire
    if($_POST) {
   
        // Les identifiants sont transmis ?
        if(!empty($_POST['login']) && !empty($_POST['password'])) {
       
            // Sont-ils les mêmes que les constantes ?
            if($_POST['login'] !== LOGIN) {
           
                $errorMessage = 'Mauvais login !';
            }
              elseif($_POST['password'] !== PASSWORD) {
             
                $errorMessage = 'Mauvais password !';
            }
              else
            {
                // On ouvre la session
                session_start();
               
                // On enregistre le login en session
                $_SESSION['login'] = LOGIN;
               
                // On redirige vers le fichier admin.php
                header('Location: admin.php');
                exit();
            }
        }
          else
        {
            $errorMessage = 'Veuillez inscrire vos identifiants svp !';
        }
    }
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
    <head>
        <title>Formulaire d'authentification</title>
    </head>
    <body>
        <form action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="post">
            <fieldset>
                <legend>Identifiez-vous</legend>
                <?php
                    // Rencontre-t-on une erreur ?
                    if(!empty($errorMessage)) {
                   
                        echo htmlspecialchars($errorMessage);
                    }
                ?>
                <p>
                    <label for="login">Login :</label>
                    <input type="text" name="login" id="login" value="" />
                </p>
                <p>
                    <label for="password">Password :</label>
                    <input type="password" name="password" id="password" value="" />
                    <input type="submit" name="submit" value="Se logguer" />
                </p>
            </fieldset>
        </form>
    </body>
</html>

Exemple de page protégée : admin.php

<?php
// On prolonge la session
session_start();

// On teste si la variable de session existe et contient une valeur
if(empty($_SESSION['login'])) {

    // Si inexistante ou nulle, on redirige vers le formulaire de login
    header('Location: authentification.php');
    exit();
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
    <head>
        <title>Administration</title>
    </head>
    <body>
    <?php
        // Ici on est bien loggué, on affiche un message
        echo 'Bienvenue ', $_SESSION['login'];
    ?>
    </body>
</html>

Petite explication : pour protéger chacune des pages de l'administration, il faut absolument ajouter en tête de fichier lepremier script entièrement. Celui-ci redirige l'utilisateur s'il n'estpas convenablement loggué. Sinon il affiche la page Web.

Liens annexes

Voici une serie de liens pour obtenir un complément d'information sur l'utilisation des sessions.


Conclusion

Le tutoriel s'achève sur ces derniers mots. Je vous conseille vivement de jeter un oeil à la documentation de PHP au sujet des sessions pour regarder du côté des autres fonctions existantes non évoquées ici. Ceci n'était que le fondement théorique des sessions basé sur un exemple concret et pratique. Vous serez à présent en mesure de construire vos propres applications web à partir de sessions.

 Historique

15 janvier 2007 00:17:52 :
Correction d'un bug d'affichage
15 janvier 2007 00:28:28 :
Correction de nouveaux bugs. Le tutoriel se trouve aussi ici : http://www.hugohamon.com/blog/lire-16-php-les-sessions-comment-ca-marche.html

Commentaires

Commentaire de papoualbert le 15/02/2007 15:22:56

Je vous remercie pour les explications claires, il ne me reste qu'a les mettre en pratique.

Commentaire de webdeb le 15/02/2007 18:12:28

Pas de problème ;)

Commentaire de FhX le 18/02/2007 21:40:20

10/10 pour ma part.

Commentaire de webdeb le 18/02/2007 23:17:04

Merci FxH :D

Commentaire de Nono272 le 03/03/2007 22:01:37

Super! merci beaucoup pour ce tuto!

Commentaire de webdeb le 04/03/2007 01:38:25

De rien ;)

Je l'ai remis sur mon nouveau site à cette adresse :

http://www.apprendre-php.com/tutoriels/tutoriel-14-les-sessions.html

++

Commentaire de chapata le 17/03/2007 13:48:42

Clair, simple, lisible et surtout compréhensibble !
Idem que FxH ... 10/10.

Merci
ChaPaTa

Commentaire de webdeb le 17/03/2007 20:22:40

Merci pour tes compliments et ta note :)

Commentaire de econs le 26/03/2007 16:12:36 administrateur CS

Vraiment très agréable à lire. ca fait plaisir.
Pour le fond, y'a juste ce qu'il faut. C'est également bien dosé, félicitations.

Commentaire de webdeb le 26/03/2007 17:48:35

Merci :)

Commentaire de OneHacker le 01/05/2007 12:17:11

Merci pour le tuto, par contre faut pas laisser la faille dans la page de login, faut penser à utiliser innerText pour pas se faire prendre le compte admin.

Commentaire de webdeb le 01/05/2007 15:14:47

Euh pourrais-tu m'expliquer cette histoire de innerText stp. Quel est le rapport avec PHP ?

Commentaire de OneHacker le 04/05/2007 12:09:37

c'est un bout de code HTML mais. Par exemple tu as un formulaire d'authentification et la plupart des sites en PHP utilise une BDD si dans login tu met le login de l'admin et en pass le code de la requete SQL qui récupère le pass avec son login, si tu utilise pas le InnerText sur la page admin.php il sera modifié dans son exécution par l'utilisateur et il va pouvoir récupérer le pass. Donc pour sécuriser lors avant la requette, il faut que la page HTML formate les données en pur texte pour qu'elle ne soit pas interprété comme du PHP en cas de tentative de hack.

Commentaire de webdeb le 04/05/2007 13:42:50

Dans ce tutoriel je n'utilise pas de base de données. Le but n'étant pas de démontrer comment créer un espace membre mais d'expliquer le mécanisme des sessions. C'est pourquoi j'ai utilisé simplement un formulaire HTML et des constantes LOGIN et PASSWORD. Mais quoiqu'il arrive, lorsque je code avec une base de données MySQL, je protège mes variables non pas avec ta méthode mais simplement avec mysql_real_escape_string() et un simple htmlspecialchars() lorsque j'affiche les informations issues de ma BDD.

Je ne vois pas où tu trouves une faille de sécurité dans mon code ^^

++

Commentaire de patcash le 14/05/2007 19:38:02

Bonjour, je voudrais juste savoir si tu pouvais mettre le session_start(); n'importe ou dans ta page ou si il faut le mettre dans les balises d'entete car moi la session marche mais elle s'interromp au bout de 4 minutes parfois et ca me le fais pas sur tous les navigateurs.

Commentaire de OneHacker le 14/05/2007 19:41:55

Je disais pas que je trouvais de faille mais htmlspecialchars suffit en effet mais moi je parlait d'un truc équivalent que ton htmlspecialchars.

Commentaire de webdeb le 14/05/2007 23:20:57

@PatCash : quand tu es en mode "session par cookie" tu es obligé de placer ton session_start() avant tout envoi au navigateur. En effet session_start() envoie un cookie au navigateur. C'est une information d'entête. Quand tu fais un setcookie(), tu es obligé de mettre ta fonction avant le html, echo, print... C'est pareil pour session_start().

@OneHacker : et oui le htmlspecialchars() suffit à se protéger des failles XSS :)

Commentaire de Rappel le 05/06/2007 02:10:47

Bonjour

Je suis un nouveau avec php, et j'ai fais le test avec ce code : si je suis en mode local (127.0.0.1), tout fonctionne. Mais lorsque je change mon IP pour avoir accès à mon site sur le WEB, la session ne suis pas, donc impossible de continuer.

Me manque-t-il un paramètre à quelque part ?

J'utilise pour l'instant EasyPhp 1.8 comme base d'expérience.

Merci

Commentaire de webdeb le 05/06/2007 08:57:41

Deux possibilités :

1. Tu es chez Free et donc il faut créer un répertoire "sessions" à la racine de ton serveur Web
2. Tu as une différence de configuration entre ton serveur Web local et le serveur en ligne. Compare les deux phpinfo() pour essayer de trouver ce qui cloche.

Commentaire de kpn le 02/11/2007 23:47:41

Salut, je cherche quelqun pour m'expliquer comment faire avec le code au niveau des tables ect... mais le truc c'est que moi je connais vraiment pas grand chose au php, j'assure facile le html et le js.

Une âme charitable prendrait-elle le temps de m'expliquer?
je laisse mon msn: keupon_versaillais@hotmail.com

merci d'avance

Commentaire de petite_etud le 08/01/2008 22:30:03

j'ai bien compri ton code..merci de le mettre comme ça délicieux!!mais lorsque je clique sur se logguer il ne s'affiche pa Bienvenu..y a quelqu'un qui peu me répond ce soir??!.merci

Commentaire de djozzeph le 23/02/2008 11:37:12

5/5 c'est exactement que je cherche merci bien ;)
et bon continuation (y)

Commentaire de daoudov05 le 24/07/2008 09:55:54

salut pour moi ca marche pas j'ai juste recopier pas a pas tous le code mais des la 3eme lignes un message d'eurre pour la fonction defines*
alors la je suis bloguer si vous avez une explication à ces problems

Commentaire de Momosky le 25/07/2008 11:29:30

Merci pr ce tuto encore une n-ième fois

Commentaire de savoirutile le 20/09/2008 19:29:17

Bonjour,
ce tutorial est sobre, clair et précis. Je crois qu'il est encouragant.
Merci.

Commentaire de Daarkmaan le 18/10/2008 22:47:36

C'est clair.

Merci !

Commentaire de toto6311 le 21/11/2009 01:08:22

clair

Commentaire de dalinda le 28/04/2010 13:30:42

je suis entrin de creer un site et jé rencontrer une petite pb j'ai une page php nommee admin.php diviser en 2 parties la 1ere c'est un formulaire ou l'administrateur peut ajouter ou modifier ou supprimer un clt de la base et la 2eme j'ai affichage du table clt de la base la pb c que lorsque l'admin clique sur le numero du client de la 2eme partie les coordonneé de ce clt doit etre transferer vers la formulaire du 1ere partie?????????????????? et j'ai pas trouvée sollution svp vous pouvez m'aIDER ET MERCI D AVANCE.

Commentaire de bigrat le 28/04/2010 14:25:05

Merci beaucoup pour les explications sérieuse , heureusement que y'a des personnes comme vous pour nous aidez
Les personnes comme vous fond vivres code sources , car beaucoup de crétins comme kohntark pourrisse le site .
Encore merci pour le travail que vous avez effectuez.

Un grand merci a bientôt , en attente de lire de nouveau tuto.

Cordialement bigrat .

Commentaire de cavalier2400 le 12/08/2010 22:06:43

Merci, une très bonne présentation, bonne explication...
mais je coince au niveau suivant
< Pour les mêmes raisons de sécurité, il est conseillé de configurer le serveur de la façon suivante
session.use_cookies 1
session.use_only_cookies 1
session.use_trans_sid 0 >

Y a t-il un tutoriel pour sur ce tronçon de code, (merci).  

Commentaire de gildev le 29/08/2010 11:13:30

Très bon tuto. Félicitations.

Commentaire de zertyx le 27/03/2011 17:34:57

merci pour ce tuot ;-)

Commentaire de romainloras le 19/11/2011 10:43:45

Super Tuto. Merci beaucoup !!!

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,281 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales