[Plan du site]
Vous êtes ici ---
> Le Site du Zér0
> Les tutoriels
> Non-Officiels
> Site Web
> PHP
> Optimisation & Sécurité
> Lecture du tutoriel
Protéger plusieurs pages d'un site en utilisant les sessions
Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
En rédigeant un site professionnel, j'ai été confronté à la nécessité d'en sécuriser les données. Je me suis basé sur
le cours de php de M@teo21 et sur quelques conseils que j'ai pu glaner sur
le forum du SdZ (merci à greenpinguin

) afin de sécuriser mes pages.
Je tiens à vous mettre en garde : cette sécurité est toute relative. Elle permet uniquement d'éviter qu'une personne qui tomberait par hasard sur le site puisse consulter le contenu des pages sans être identifiée. Un

mal intentionné aura vite fait, je pense de contourner la difficulté.
Déclaration des variables
1) La "session_start();"
Cette fonction permet de récupérer les variables
$_SESSIONS[] sur toutes les pages où elle aura été réalisée. On doit la placer avant tout code html, sur toutes les pages à sécuriser.
2) La variable "$_SESSION['connect'];"
Par défaut, on lui donne comme valeur "0". Vous pouvez lui donner le nom que vous voulez, mais
connect est assez parlant je trouve

. Elle prendra la valeur "1" lorsque l'identification aura été vérifiée.
3) Les variables transmises par le formulaire d'identification
Elles sont transmises par la méthode "post". On les nomme
$_POST['login'] et
$_POST['mot_de_passe']. Elles vont nous permettre de savoir si la personne qui s'est identifiée est bien une de celles que l'on attend.
Le code de l'index
J'ai placé des commentaires après chaque ligne afin de vous permettre de bien en comprendre le sens.
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 | <?php
session_start();// À placer obligatoirement avant tout code html
$_SESSION['connect']=0; //initialise la variable 'connect'
if (isset($_POST['mot_de_passe']) AND isset($_POST['login'])) // Si les variables existent
{
$mot_de_passe=$_POST['mot_de_passe'];
$login=$_POST['login'];//On récupère les données envoyées par la méthode POST du formulaire d'identification
}
else // Les variables n'existent pas encore
{
$mot_de_passe="";
$login="";// On crée des variables $mot_de_passe et $login vides
}
if (($mot_de_passe == "SITEDUZERO" AND $login == "ZOZOR") OR ($mot_de_passe == "MONSITEAMOI" AND $login == "POILU")OR ($mot_de_passe == "NONMONMIEN" AND $login == "ZOZORETTE") OR ($mot_de_passe == "KANGOUROU" AND $login == "JERRY"))
// Si le mot de passe et le login sont bons (valable pour 1 utilisateur ou plus). J'ai mis plusieurs identifiants et mots de passe.
{
$_SESSION['connect']=1; // Change la valeur de la variable connect. C'est elle qui nous permettra de savoir s'il y eu identification.
$_SESSION['login']=$login;// Permet de récupérer le login afin de personnaliser la navigation
// On affiche la page cachée.
?>
|
Et le code html de la page cachée en exemple :
Code : HTML
Ce code est donc celui que vous souhaitez protéger.
Nous allons voir maintenant celui de la page d'identification.
Il fait appel aux formulaires. Je ne m'étendrai pas dessus car c'est un simple code html.
Il doit être placé entre deux bouts de code php afin de finaliser celui commencé plus haut :
Code : PHP1
2
3
4
5
6
7 | <?php
}
else // le mot de passe n'est pas bon
{
// On affiche la zone de texte pour rentrer le mot de passe.
?>
|
Code : HTML 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<title>Identification</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<link rel="stylesheet" media="screen" type="text/css" title="TNM" href="design_accueil.css" />
<!-- Lien vers la favicon -->
<link rel="shortcut icon" type="image/x-icon" href="images/favicon.ico" height="48" width="48"/>
</head>
<body>
<!-- Le corps -->
<div id="corps">
<p>Veuillez vous identifier pour accéder au site :</p>
<form action="index.php" method="post">
<p>
Votre login : <input type="text" name="login"/>
Votre mot de passe : <input type="password" name="mot_de_passe"/><input type="submit" value="Valider"/>
</p>
</form>
</div>
<!-- Le pied de page -->
<div id="pied_de_page1">
</div>
</body>
</html>
|
Code : PHP1
2
3
4
5
6 | <?php
} // Fin du else
// Fin du code :)
?>
|
Voilà. Nos pages
index et
identification sont finies (en fait c'est la même page mais l'affichage est fonction du code php).
Nous allons voir maintenant la structure d'une autre page du site.
Le principe est grosso-modo le même que pour la page d'index. Mais cette fois, il n'y a pas de page d'identification.
Vérification des variables
La première chose à faire est de vérifier que l'identification a bien eu lieu. Cela se traduit par le fait que la variable
$_SESSION['connect'] est passée de l'état "0" à l'état "1" (voir code php de l'index

). Si c'est le cas, on affiche la page. Sinon, on demande au visiteur de s'identifier.
Là encore, il est nécessaire de placer
session_start(); avant tout code xhtml.
Un petit code vaut mieux qu'un long discours :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | <?php
session_start();
if (isset($_SESSION['connect']))//On vérifie que le variable existe
{
$connect=$_SESSION['connect'];//On récupère la valeur de la variable de session
}
else
{
$connect=0;//Si $_SESSION['connect'] n'existe pas, on donne la valeur "0"
}
if ($connect == "1") // Si le visiteur s'est identifié
{
// On affiche la page cachée.
?>
|
Code : HTML 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 | <!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>Site super</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<!-- Lien vers la favicon -->
<link rel="shortcut icon" type="image/x-icon" href="images/favicon.ico"/>
<!-- Ci-dessous le design "par défaut" du site -->
<link rel="stylesheet" media="screen" type="text/css" title="design" href="design_par_defaut.css" />
</head>
<body>
<div id="en_tete">
</div>
<div id="menus">
</div>
<!-- Le corps -->
<div id="corps">
<h1>Blabla</h1>
<p>Que du blabla sur mon site</p>
</div>
<!-- Le pied de page -->
<div id="pied_de_page">
</div>
</body>
</html>
|
Si le visiteur ne s'est pas identifié (s'il a tapé directement l'adresse de la page), il faut lui demander de s'identifier et on lui affiche une autre page.
Code : PHP1
2
3
4
5
6
7 | <?php
}
else // le mot de passe n'est pas bon
{
// On affiche la zone de texte pour rentrer le mot de passe.
?>
|
Code : HTML 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<title>Visiteur inconnu</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<link rel="stylesheet" media="screen" type="text/css" title="suite" href="design_accueil.css" />
<!-- Lien vers la favicon -->
<link rel="shortcut icon" type="image/x-icon" href="images/favicon.ico" height="48" width="48"/>
</head>
<body>
<!-- Le corps -->
<div id="corps">
<p>Veuillez vous identifier pour accéder au site :</p>
<form action="index.php" method="post">
<p>
<input type="submit" value="OK" />
</p>
</form>
</div>
<!-- Le pied de page -->
<div id="pied_de_page1">
</div>
</body>
</html>
|
Et on finit le code php précédemment commencé car là encore, tout ne tient en fait que sur une seule page.
Code : PHP1
2
3
4
5
6 | <?php
} // Fin du else
// Fin du code :)
?>
|
Pour clôturer le site proprement, il est de bon ton de se déconnecter. Même si l'utilisateur ne le fait pas et ferme la fenêtre du navigateur, la session est quand même en théorie supprimée.
Le mieux, pour que l'utilisateur pense à se déconnecter, est de mettre le bouton de déconnexion en évidence. J'utilise pour ma part un formulaire, car cela permet d'avoir un bouton facilement mis en page (je suis un peu feignasse, je dois l'avouer

).
Il doit être placé sur toutes vos pages quelle que soit sa forme (lien basique ou formulaire).
Voici ce que j'utilise.
Code : HTML1
2
3
4
5 | <p>
<form action="déconnexion.php" method="post">
<p>
<input type="submit" value="Déconnexion" />
</p>
|
Une fois sur la page de déconnexion, il est nécessaire de "mettre à jour" les variables
$_SESSION et d'effacer ce qu'elles pourraient éventuellement contenir.
Pour cela, je vous conseille de "ratisser" large.
Pour pouvoir, les effacer, il faut tout d'abord pouvoir les appeler.
À nouveau, une
session_start(); est nécessaire.
Les sessions étant des arrays, on va tout simplement en vider le contenu par la ligne de code suivante :
Code : PHP
Un cookie est automatiquement généré lors de l'utilisation des sessions. Il est normalement effacé à la clôture de la session. Par précaution, il vaut mieux l'effacer manuellement en procédant ainsi :
Code : PHP1
2 | if (isset($_COOKIE[session_name()]))
{setcookie(session_name(),'',time()-4200,'/');}
|
Ensuite, et c'est fini, on détruit la session avec la fonction
session_destroy();.
Le code de la page se résume donc ainsi :
Code : PHP1
2
3
4
5
6
7
8
9 | <?php
session_start();
$_SESSION = array();
if (isset($_COOKIE[session_name()]))
{setcookie(session_name(),'',time()-4200,'/');}
session_destroy();
?>
|
Code : HTML 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 | <!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>Au revoir</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<!-- Lien vers la favicon -->
<link rel="shortcut icon" type="image/x-icon" href="images/favicon.ico" height="48" width="48"/>
<!-- Ci-dessous le design "par défaut" du site -->
<link rel="stylesheet" media="screen" type="text/css" title="TNM" href="design_accueil.css" />
</head>
<body>
<div id="corps">
<h1 style="color-font: #6ba5ef; font-size: 2em;">Vous êtes à présent déconnecté</h1>
<form action="index.php" method="post">
<p>
<input type="submit" value="OK"/>
</p>
</form>
</div>
<!-- Le pied de page -->
<div id="pied_de_page3">
</div>
</body>
</html>
|
Mon site est hébergé en intranet, ce qui limite énormément la présence de hackers

.
Voici quelques liens qui peuvent être utiles et que je vous recommande vivement de lire.
Introduction à la sécurité en php : quelques considérations générales sur la sécurité en php. Très instructif (de même que les chapitres suivants).
Les sessions : pour ceux qui veulent en savoir plus.
Et je finirai sur ces quelques mots empruntés à ce fameux
miguel euh, non, manuel :
Citation : Manuel PHPUn principe qu'il est bon de retenir : un système est aussi sûr que son maillon le plus faible.
À méditer.