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 ?
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 ?

Ton tuto ne sert à rien !
Et puis quoi encore ? Comme si j'allais créer un tutoriel pour rien !
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 ?
- Premièrement, il doit "sécuriser" les données $_GET, un simple htmlentities.
- 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.
- 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 ?
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 : PHP1
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

). 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.
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 : PHP1
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 : PHP1
2
3
4
5
6
7 | <?php
if(is_file('./pages/'.$page.'.php')) include('./pages/'.$page.'.php');
else include('./pages/erreur404.html');
?>
|
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');
?>
|