NoShade.net est en vente — Contactez nous si vous êtes intéressé
Le siteTutoriauxInterviews
icone RSS NoShade.net

Accueil » Tutoriaux » PHP » Chapitre 5.1 : Les sessions et Cookies

Les tutoriaux Php

5.1 Les sessions et cookies


Les sessions



Nous allons voir là une fonctionnalité complètement géniale de PHP, il s'agit des sessions.

Qu'est-ce que les sessions?



Lorsque vous vous connectez à un site Internet avec votre identifiant et mot de passe, vous êtes accueillis par une page de bienvenue, vous disant "Bienvenue MachinTruc42!". Nous avons vu ceci dans le cours sur les variables $_POST.
Mais cela va bien plus loin, car tout au long de votre surf sur ce même site, vous restez connectés de pages en pages... Voilà, une session, c'est ça, cela consiste à faire passer des données d'unes page à l'autre, ou plutôt, de garder en mémoire des informations tant que le visiteur est connecté sur le site.

Dans le cas d'un login par exemple, on pourrait garder en session l'identifiant du membre, pour le réutiliser par la suite, notamment grâce aux conditions.

Nous avons appris tout au long du chapitre 4 les bases de données. Vous êtes donc capables de créer un site avec un module d'actualités, un livre d'or, une liste d'objets...
Vous avez donc développé votre petite "partie privée", vous permettant de gérer tout cela.
Imaginons que vous ayez procédé ainsi. Dans un répertoire "gestion", vous avez les fichiers suivants :
      - index.php (formulaire d'identification login/mot de passe)
      - gestion_accueil.php
      - gestion_actualites.php
      - gestion_actualites_ajouter.php
      - gestion_livredor.php
      - gestion_produits.php
      - gestion_produits_ajouter.php

Si un visiteur s'amuse donc à aller à l'adresse suivante : www.monsite.com/gestion/
Il tombera sur votre page "index.php", lui demandant de saisir un identifiant et mot de passe, pas de souci, il est bloqué là et ne peut rien faire de plus.
Par contre, si celui-ci connaît l'adresse d'une des autres pages pour une raison quelconque, et qu'il s'amuse donc à aller directement sur www.monsite.com/gestion/gestion_accueil.php que se passe-t-il?
Celui-ci à tout simplement accès à la gestion complète de votre site, car vous n'avez pas protégé cette partie.

Grâce aux sessions, nous allons pouvoir le faire sortir de là en un clin d'oeil!

Nous définirons simplement dans le code de chaque pages "Si il n'y a aucune session d'administrateur, alors le visiteur est redirigé sur la page d'index, grâce à une fonction header(). Sinon, on ne fait rien, c'est bon."
Bien entendu, nous n'appliquerons pas cette condition à la page index.php, pour que l'on puisse s'identifier...

Prenons donc ce cas d'utilisation comme exemple, et voyons comment définir une session, avant d'apprendre à la lire.

Connexion



Nous allons donc avoir une page index.php contenant un formulaire, avec un champ de texte nommé "login" et un champ à puces nommé "mot_de_passe". Celui-ci pointera vers cette même page, soit "index.php", où nous vérifierons la validité des identifiants envoyés.

<?php
    
// Demarrage obligatoire des sessions avant le code HTML
    
session_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="content-type" content="text/html;charset=iso-8859-1"/>
        <title>Interface de gestion - Connexion</title>
    </head>
    <body>
<?php
    
// Si il y a une variable $_POST['login'] et une variable $_POST['mot_de_passe']
    
if(isset($_POST['login']) AND isset($_POST['mot_de_passe']))
    {
        
// Si la variable $_POST['login'] vaut "Justin"
        // Et que la variable $_POST['mot_de_passe'] vaut "Bridou"
        
if($_POST['login'] == 'Justin' AND $_POST['mot_de_passe'] == 'Bridou')
        {
        
// On definit une variable $_SESSION['SIteAdmin'] qui vaut : le login
        
$_SESSION['SiteAdmin'] = $_POST['login'];
        
// On envoie l'administrateur sur la page de d'accueil de gestion
        
header('Location: ./gestion_accueil.php');
        }

        else 
// Si le login ou mot de passe est incorrect
        
{
        echo 
'Mauvais login et/ou mot de passe';
        }
    }
    
// Si il n'y a pas eu de validation du formulaire, on ne fait rien
    
else { }
?>
        <center><h1>Identification</h1>
        <form id="identification" action="index.php" method="post" name="identification">
        Login : <input type="text" name="login" size="20"/>
        Mot de passe : <input type="password" name="mot_de_passe" size="20"/><br />
        <input type="submit" name="validation" value="Validation"/>
        </form></center>

    </body>
</html>


Lisez bien les commentaires, vous devriez aisément comprendre ce code! :)
Les sessions, ce sont donc des variables, rien de bien compliqué, elles se notent un peu de la même manière que les variables $_GET et $_POST et ont elles aussi un nom et une valeur ($_SESSION['nom'] = valeur).

A préciser, et c'est très important, sinon votre script ne marchera pas, que vous devez obligatoirement écrire la fonction session_start() avant d'écrire la moindre ligne de code HTML, le mieux étant donc de l'écrire en tout début de votre page.
Celle-ci à pour but, comme précisé en commentaire, de démarrer les sessions, soit de dire "on va utiliser les sessions dans cette page" à PHP.

Maintenant, vous devez donc certainement vous imaginer que, pour lire ces variables, ça ne sera pas beaucoup plus compliqué que pour les variables $_GET et $_POST, il suffit d'en faire un echo, et vous avez tout à fait raison! Ce n'est pas plus compliqué que cela.

Dans la page gestion_accueil.php, nous allons donc vérifier la présence d'une variable $_SESSION['SiteAdmin'], si celle-ci est présente, c'est que le login et mot de passe rentrés dans le formulaire d'identifications sont correctes, nous afficherons donc le contenu de la page. Dans le cas contraire, on renvoie le visiteur sur la page index.php pour qu'il s'identifie.

<?php
    session_start
(); // Demarrage des sessions

    // Si il y a une variable $_SESSION['SiteAdmin']
    
if(isset($_SESSION['SiteAdmin']))
    { } 
// Alors c'est tout bon, on est connecte

    
else // Sinon, c'est qu'on est pas connecte
    
header('Location: ./index.php'); } // On ramene donc le visiteur sur le page de login

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="content-type" content="text/html;charset=iso-8859-1"/>
        <title>Interface de gestion - Accueil</title>
    </head>
    <body>

    <h1>Interface de gestion</h1>
    <p>Liste des actualit&eacute;s | Ajouter une actualit&eacute; | G&eacute;rer le livre d'or | Liste des produits | Ajouter un produit | Se d&eacute;connecter</p>
    <hr />
    <center><p>Bienvenue <?php echo $_SESSION['SiteAdmin']; ?>!</p></center>

    </body>
</html>


Nous démarrons donc les sessions, on vérifie que la variable $_SESSION['SiteAdmin'] est bien présente, dans le cas contraire, on renvoie le visiteur sur la page index.php. Cette protection suffit à protéger l'accès à cette page. En toute logique donc, si le visiteur n'est pas passé par la page index.php pour s'identifier, et qu'il cherche directement à accéder à la page gestion_accueil.php, celui-ci sera automatiquement redirigé sur la page index.php.

Vous pouvez, pour simplifier votre code, créer un fichier "inc.protection_admin.php" à la racine de votre dossier "gestion", qui contiendrait uniquement le code suivant :

<?php
    session_start
(); // Demarrage des sessions

    // Si il y a une variable $_SESSION['SiteAdmin']
    
if(isset($_SESSION['SiteAdmin']))
    { } 
// Alors c'est tout bon, on est connecte

    
else // Sinon, c'est qu'on est pas connecte
    
header('Location: ./index.php'); } // On ramene donc le visiteur sur le page de login
?>


Puis en faire une inclusion (via la fonction include()) au début de chacune de vos pages de gestion.

Plutôt sympa, non? :)
Ne nous reste maintenant plus qu'à apprendre à détruire cette session, pour nous déconnecter.

Déconnexion



Par mesure de sécurité, il est toujours utile de se déconnecter de notre interface de gestion, une fois que l'on a fini de gérer notre petit site.

Comme vous l'avez vu, dans la page "gestion_accueil.php", j'ai prévu dans le menu : "Se déconnecter".

Créez un lien là dessus, pointant vers une page "gestion_deconnexion.php" par exemple.

Nous allons, pour nous déconnecter, effacer toutes les variables de sessions, simplement en définissant "$_SESSION = array()", puis, on détruira la session grâce à la fonction "session_destroy()".
Deux petites lignes de code suffisent donc à nous déconnecter proprement.

Voyons le code de la page gestion_deconnexion.php :

<?php
    session_start
(); // Demarrage des sessions

    
$_SESSION = array(); // On detruit toutes les variables de session
    
session_destroy(); // On detruit la session
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="content-type" content="text/html;charset=iso-8859-1"/>
        <title>Interface de gestion - D&eacute;connexion</title>
    </head>
    <body>

<p>Vous avez bien &eacute;t&eacute; d&eacute;connect&eacute;. A bient&ocirc;t!</p>

    </body>
</html>


Simple, non? :)

Si vous voulez vous amusez, vous pouvez par exemple faire un header() sur la page index.php (qui contient le formulaire d'identification) avec une variable ?action=deconnexion par exemple, puis dire "si il y a une variable $_GET['action'] et que celle-ci vaut "deconnexion", alors on détruit la session et on affiche un message pour valider la déconnexion". A vous de voir, c'est très simple à faire, faites le, ça ne vous fera pas de mal, au contraire, cela vous fera réviser un peu nos cours précédents! ;)

Les cookies



Nous en avons fini avec les sessions, voyons maintenant les cookies, dans le même esprit que les sessions.

Qu'est-ce qu'un cookie?



Avec les sessions, nous avons donc appris à faire passer des données d'une page à l'autre, tout au long de notre connexion. Une fois que vous fermez votre navigateur web, votre session est effacée au bout de 30 minutes environ (cela dépend de la configuration du serveur).

Nous, nous aimerions garder ces informations plus longtemps, même après que le visiteur ait éteint son ordinateur et soit parti en vacances.
En définissant un cookie, si le visiteur revient sur son site préféré, celui-ci sera toujours identifié.

Alors, non, cela ne pose pas de problème de sécurité, on ne laisse pas son compte ouvert pendant 3 mois comme ça...
Lorsqu'il va se connecter pour la première fois, nous allons non seulement lui attribuer une session, mais également écrire un cookie... sur son ordinateur!

Un cookie est donc un petit fichier qui permet de stocker des informations sur l'ordinateur du visiteur (aussi appelé Client), que nous allons pouvoir relire par la suite.

Dans ce cookie, nous aurons donc :
- Le nom du cookie, par exemple "Identifiant",
- La valeur de "Identifiant",
- Le site sur lequel est utilisé le cookie, le site qui à écrit ce cookie donc.

Si vous voulons définir plusieurs cookies pour un même site, c'est possible, tous seront stockés dans le même fichier sur votre disque dur.

Vous vous demandez certainement où sont donc ces petits fichiers? :-o

Cela dépend du navigateur Internet que vous utilisez.
Sous Firefox, comme sous Safari ou Camino, vous pouvez en voir la liste via les préférences de Vie privée ou Sécurité.
Sous (berk) Internet Explorer, ceux-ci sont placés sur votre disque dur, dans C:windowsTemporary Internet Files.
Vous pouvez voir une série de fichiers commençant par Cookie: ...

Côté code, c'est donc simple. Une fois que le visiteur arrive sur le site, on vérifie si un cookie est présent ou non. Si un cookie est présent, alors on va le lire et mettre en session ce cookie, comme si le visiteur venait de se connecter.
Si il n'y a pas de cookie, alors il est considéré comme non connecté, c'est aussi simple que cela.

Bien sûr, dans cet exemple, nous allons utiliser les cookies pour stocker les identifiants de connexion à un site, mais vous pouvez vous en servir pour autre chose, par exemple pour retenir le thème d'interface préféré du visiteur, si votre site comporte plusieurs interfaces, ou encore la langue utilisée par le visiteur, si votre site est traduit en plusieurs langues, et bien d'autres choses!

Ecrire un cookie



Voyons ensemble le code qui va nous permettre d'écrire ce cookie lorsque l'on se connecte :

// Date d'expiration = Timestamp actuel + 30 000 000 secondes soit presque un an
$date_expiration time() + 30000000;
// Ecrire le cookie(nom du cookie, valeur du cookie, date d'expiration)
setcookie("login",$_POST['login'],$date_expiration);

Commenté ainsi, le code parle bien de lui-même me semble-t-il, non? :)

On peut créer plusieurs cookies d'un coup, simplement en écrivant plusieurs lignes setcookie à la suite. Utile par exemple pour stocker le login et mot de passe du visiteur


Ce code vient donc se placer dans la page index.php, juste après avoir crée la session "SiteAdmin", et avant de rediriger le visiteur sur la page "gestion_accueil.php".
En deux lignes, nous avons écris notre premier cookie! Alors, heureux? :D

Si ce n'est pas fait, déconnectez-vous de votre interface de gestion, puis, re-identifiez-vous avec le login "Justin" et le mot de passe "Bridou" (j'espère bien que vous avez su lire ça dans le code, non mais!). Lors du log-in, le cookie est crée.

Si vous voulez, allez vérifier la présence de ce cookie à l'endroit précisé plus haut dans ce tutoriel, celui-ci est bien là, et n'attend plus qu'à être utilisé! :)

Lire un cookie



Je ne pense plus vous surprendre en vous annonçant que notre cookie se lira tout simplement en faisant un echo de $_COOKIE['login']! ;)

Alors, vous pouvez, pour vérifier que cela marche bien, faire cet echo de $_COOKIE['login'] sur une de vos pages, soit index.php, soit gestion_accueil.php, comme vous le voulez, prennez une minute pour tester le bon fonctionnement de ce script. :)

Nous allons aller un poil plus loin, en demandant à PHP de créer une session de connexion, si un cookie est présent, afin de se connecter directement une fois que l'on se connecte à notre interface de gestion, soit en allant sur www.monsite.com/gestion/ dans notre navigateur.
En allant dans ce dossier, nous allons bien entendu automatiquement tomber sur la page index.php. C'est donc dans celle-ci que nous allons créer ce petit script.

Voici donc, toujours aussi bien commenté, le contenu de la page index.php :

<?php
    
// Demarrage obligatoire des sessions avant le code HTML
    
session_start();

    
// Si il y a un cookie $_COOKIE['login']
    
if(isset($_COOKIE['login']))
    {
    
// Alors c'est tout bon, on cree donc une session pour etre connecte
    
$_SESSION['SiteAdmin'] = $_COOKIE['login'];
    
// Et on envoie le visiteur a la page d'accueil de la gestion du site
    
header('Location: ./gestion_accueil.php');
    }
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="content-type" content="text/html;charset=iso-8859-1"/>
        <title>Interface de gestion - Connexion</title>
    </head>
    <body>
<?php
    
// Si il y a une variable $_POST['login'] et une variable $_POST['mot_de_passe']
    
if(isset($_POST['login']) AND isset($_POST['mot_de_passe']))
    {
        
// Si la variable $_POST['login'] vaut "Justin"
        // Et que la variable $_POST['mot_de_passe'] vaut "Bridou"
        
if($_POST['login'] == 'Justin' AND $_POST['mot_de_passe'] == 'Bridou')
        {
        
// On definit une variable $_SESSION['SIteAdmin'] qui vaut : le login
        
$_SESSION['SiteAdmin'] = $_POST['login'];
        
        
//======= CREATION D'UN COOKIE
        // Date d'expiration = Timestamp actuel + 30 000 000 secondes soit presque un an
        
$date_expiration time() + 30000000;
        
// Ecrire le cookie(nom du cookie, valeur du cookie, date d'expiration)
        
setcookie("login",$_POST['login'],$date_expiration);
        
//============================

        // On envoie l'administrateur sur la page de d'accueil de gestion
        
header('Location: ./gestion_accueil.php');
        }

        else 
// Si le login ou mot de passe est incorrect
        
{
        echo 
'Mauvais login et/ou mot de passe';
        }
    }
    
// Si il n'y a pas eu de validation du formulaire, on ne fait rien
    
else { }
?>
        <center><h1>Identification</h1>
        <form id="identification" action="index.php" method="post" name="identification">
        Login : <input type="text" name="login" size="20"/> 
        Mot de passe : <input type="password" name="mot_de_passe" size="20"/><br />
        <input type="submit" name="validation" value="Validation"/>
        </form></center>

    </body>
</html>


Voilà, pas très compliqué tout ça hein? :) Et pourtant tellement puissant...

Nous en avons fini avec les sessions et les cookies, vous allez maintenant pouvoir protéger les pages de gestion de votre site, ce qui est vraiment très important de nos jours!

A bientôt pour le chapitre suivant. :)

Par : Legibe, le 1 octobre 2006

Sommaire du cours PHP

» Sommaire
» 1.1 Avant propos
» 1.2 Que faut'il pour faire du php?
» 2.1 Écrire du texte en PHP
» 2.2 Les commentaires, les variables et les calculs
» 2.3 Les conditions
» 2.4 La concaténation + Évaluation
» 3.1 Transmission de données
» 3.2 Les fonctions + Dates et heures
» 3.3 Les Arrays (tableaux) + les boucles
» 4.1 Les bases de données
» 4.2 Lecture dans une BDD
» 4.3 Enregistrer dans une BDD
» 4.4 Modifier le contenu d'une table
» 4.5 Supprimer du contenu dans une BDD
» 4.6 Statistiques
» 5.1 Les sessions et cookies
» 5.2 Exercice : Un système de login multi-membres