Sécurité
Gestion de la sécurité dans les templates
Pages autorisées
Pour éviter une saisie directe dans la barre d'adresse d'un fichier malveillant, on crée une liste de pages autorisées.
<?php
// création d'un tableau associatif qui liste les pages autorisées
$pages_autorisees = array('Accueil' =>'accueil.php','Page1' => 'page1.php','Page2' => 'page2.php');
?>
<html><head></head>
<body>
Menu:<br>
<a href="index.php?page=Accueil">Accueil</a><br>
<a href="index.php?page=Page1">Page 1</a><br>
<a href="index.php?page=Page2">Page 2</a><br><br>
<?php
// test si la variable 'page' est définit ET si elle est dans le tableau '$pages_autorisees'
if ( (isset($_GET['page'])) && (in_array($_GET['page'],$pages_autorisees)) ) {
require_once($pages_autorisees[$_GET['page']]);
} else {
require_once('accueil.php');
}
?>
</body></html>
Pages autorisées dynamique
Mais le problème est qu'il faut remplir "à la main" le tableau des noms de pages autorisées. Voici une solution pour un remplissage dynamique :
Remplissage dynamique de la matrice $pages_autorisees<?php
$dossier = opendir("."); // Ouvrir le dossier courant
$i = 0;
// Tant que l'on peut lire des noms de fichiers
while($fichier = readdir($dossier)) {
// si les noms ne sont pas ".." et vide
if ($fichier != ".." && $fichier != "") {
$pages_autorisees[$i] = $fichier; // On stocke dans la matrice
$i++;
}
}
closedir($dossier); // On ferme le dossier
?>
<html><head></head>
<body>
... le reste du code
Exemple complet: remplissage dynamique et affichage dynamique du menu
<?php
// on récupère le nom de la page
if (isset($_GET['page'])) {
$page = $_GET['page'];
}
else {
$page = 'accueil.php';
}
// remplissage dynamique des pages autorisées
$dossier = opendir("rep"); // on ouvre le dossier "rep"
$i = 0;
// tant que l'on peut lire des noms de fichiers
while($fichier = readdir($dossier)) {
// et si les noms ne sont pas ".." et vide
if ($fichier != "." && $fichier != ".." && $fichier != "") {
$pages_autorisees[$i] = $fichier; // on les stockes dans la matrice
$i++;
}
}
closedir($dossier); // on ferme le dossier
?>
<html>
<head></head>
<body>
<h3>Menu dynamique:<br />|
<?php
for($i = 0; $i < count($pages_autorisees); $i++) {
$pages_menu = substr($pages_autorisees[$i],0,-4); // pour enlever le ".php" à l'écran
echo '<a href="index.php?page='.$pages_autorisees[$i].'">'.ucfirst($pages_menu).'</a> | ';
}
?></h3>
<h2>
<?php
if (file_exists("rep/".$page) && in_array($page,$pages_autorisees)) {
require_once("rep/".$page); } else { require_once('rep/accueil.php'); }
?></h2>
</body>
</html>
Vous pouvez aussi utiliser la variable prédéfinit $_GET[] pour réaliser une gestion dynamique de variables