Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les tutoriels > Non-Officiels > Site Web > PHP > Optimisation & Sécurité > Lecture du tutoriel

Système d'Includes Sécurisées

Avatar
Auteur : Quadehar
Créé : le 08/12/2005 20:10:17
Modifié : le 18/08/2007 20:56:22
Noter et commenter ce tutoriel
Imprimer ce tutoriel
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)
Bonjour, chers Zér0s. ^^

Si nous sommes ici, c'est pour apprendre à créer un système d'include qui, je pense, est sécurisé.

Mais qu'est-ce qu'un système d'include ? A quoi k'sa sert ? o_O

Hé bien en fait, un système d'include permet de simplifier les modifications de design et de liens des menus, car tout sauf la partie centrale est contenu dans une seule page, et on se contente d'include grâce à la fonction include() le centre de la page.

Hé bien, ne suffit-il pas de faire include() au milieu de la page ? o_O Ton tuto ne sert à rien !

Et puis quoi encore ? Comme si j'allais créer un tutoriel pour rien ! ^^ :lol:

En fait, un système d'include se sert des données $_GET (qui se trouvent dans l'URL de la page) pour savoir quelles pages inclure, et comme un utilisateur peut très aisément modifier l'adresse, il faut faire en sorte de protéger le système d'includes, ce que nous allons faire. ^^

Tout d'abord, que doit faire notre système ?
  1. Premièrement, il doit "sécuriser" les données $_GET, un simple htmlentities.
  2. Ensuite, on peut choisir deux méthodes :
    -> soit on recense toutes les pages autorisées dans un array,
    -> soit on vérifie simplement que la page existe sur le FTP.
  3. Puis il faut inclure la page.

Notez que si la page n'existe pas, il faudra penser à afficher la page d'accueil. ;) Bon, on va peut-être commencer ? :)
Sommaire du chapitre :

Avec un Array

Donc, en tout premier, on récupère les données $_GET, et on effectue dessus un htmlentities :
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<?php
 
$page = (!empty($_GET['page'])) ? htmlentities($_GET['page']) : 'index';
 
/* 
J'ai utilisé ici une condition ternaire. Cela permet d'attribuer une valeur à une variable selon une condition. En voici la syntaxe :
$variable = (condition) ? 'valeur si condition true' : 'valeur si condition false';
 
Du reste, ce code est très facile à comprendre :) Ici, index est mise comme page par défaut
*/
 
?>


Ensuite, il nous faut faire la liste des pages autorisées. Nous utiliserons pour cela un array tout simple. :)

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<?php
 
$array_pages = array(
     'index' => 'index.php',
     'page1' => 'page1.php',
     'page2' => 'page2.html'
);
 
// Et voilà, là aussi, rien de compliqué.
 
?>


Bon, il nous reste plus qu'à inclure la page ! :) C'est la seule petite difficulté. Voici le code :

Code : PHP
1
2
3
4
5
6
7
8
9
<?php
 
if(!array_key_exists($page, $array_pages)) include('index.php');
 
elseif(!is_file($array_pages[$page])) include('erreur.php'); 
 
else  include($array_pages[$page]);
 
?>


Ici, on vérifie que la page est bien dans l'array grâce à array_key_exists. Sinon, on inclue index.php (si vous avez une page d'erreur 404, remplacez index.php par le nom de votre page 404 :) ). Puis, on vérifie que le fichier est bien présent sur le FTP (on ne sait jamais, des fois que vous ayez oublié de le mettre sur le FTP :p ). Sinon, on inclue la page erreur.php, dans laquelle vous pouvez indiquer de rapporter l'erreur au webmaster pour qu'il la corrige, etc.

Enfin, s'il n'y a aucun problème, on inclue la bonne page.


Au final, nous avons le code suivant :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<?php
 
$page = (!empty($_GET['page'])) ? htmlentities($_GET['page']) : 'index';
 
$array_pages = array(
     'index' => 'index.php',
     'page1' => 'page1.php',
     'page2' => 'page2.html'
);
 
if(!array_key_exists($page, $array_pages)) include('index.php');
 
elseif(!is_file($array_pages[$page])) include('erreur.php'); 
 
else  include($array_pages[$page]);
 
?>


Cette méthode est plus longue que la simple vérification de l'existence d'une page sur le FTP, mais au moins, on peut limiter les pages accessibles (il arrive qu'une page, pour une raison ou une autre, ne doit jamais être incluse), et on peut choisir l'extension de la page.

En vérifiant si le fichier existe

Cette méthode est moins sécurisée, car on peut alors accéder à n'importe quelle page dans le dossier pages ! Si vous ne le souhaitez pas, choisissez la première méthode plus haut.


Pour commencer, il va falloir récupérer les données $_GET, puis vérifier qu'il n'y a aucun point (pour qu'on ne puisse pas accéder aux autres dossiers en faisant ../autre_dossier/) grâce à une Regex tout simple. Voici le code :

Code : PHP
1
2
3
4
5
6
<?php
 
$page = (!empty($_GET['page'])) ? htmlentities($_GET['page']) : 'index';
if(preg_match('`\.`', $page))  $page = 'erreur404';
 
?>


Ensuite, nous allons vérifier si la page demandée existe dans le dossier /pages/ grâce à la fonction is_file. Si oui, on inclue la page, sinon, on inclue une page d'erreur 404.
Voici comment il faudra faire :

Code : PHP
1
2
3
4
5
6
7
<?php
 
if(is_file('./pages/'.$page.'.php'))  include('./pages/'.$page.'.php');
 
else  include('./pages/erreur404.html');
 
?>


Si vous voulez avoir le choix entre plusieurs extensions, vous pouvez procéder ainsi :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<?php
 
if(is_file('./pages/'.$page.'.php'))  include('./pages/'.$page.'.php');
 
elseif(is_file('./pages/'.$page.'.html'))  include('./pages/'.$page.'.html');
 
elseif(is_file('./pages/'.$page.'.htm'))  include('./pages/'.$page.'.htm');
 
else  include('./pages/erreur404.html');
 
?>


Ainsi, vous pourrez inclure une page index.html, ou bien lexique.htm ;) .



Ce qui nous donne finalement le code suivant :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<?php
 
$page = (!empty($_GET['page'])) ? htmlentities($_GET['page']) : 'index';
if(preg_match('`\.`', $page))  $page = 'erreur404';
 
if(is_file('./pages/'.$page.'.php'))  include('./pages/'.$page.'.php');
 
// Les deux lignes suivantes sont facultatives, comme vous pouvez le voir juste au-dessus.
elseif(is_file('./pages/'.$page.'.html'))  include('./pages/'.$page.'.html');
elseif(is_file('./pages/'.$page.'.htm'))  include('./pages/'.$page.'.htm');
 
else  include('./pages/erreur404.html');
 
?>

Et voilà, ce tutoriel est terminé. ;) Si vous en comprenez pas telle ou telle partie, n'hésitez pas à m'envoyer un message privé. ;)
Auteur : Quadehar
Noter et commenter ce tutoriel
Imprimer ce tutoriel

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | Fil RSS | XHTML 1.0 | CSS 2.0
Édité par Simple IT SARL : Nous contacter | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 133 Zéros connectés | Requêtes SQL 7 requêtes | Temps de génération de la page : Total (SQL) 0.0289s (0.0123s)