Bonsoir à toutes et à tous,
J'ai essayé de trouver un peu partout sur internet la meilleure façon de faire un include bien sécurisé afin d'éviter qu'il y ait des ptits malins qui s'amusent (comme j'ai pu le lire d'après certains témoignages). Seulement y'a pleins de solutions, parfois qui sont différentes les unes des autres et ce n'est pas facile de trouver ses repères!

Sachant que j'ai beaucoup de pages, imaginer de les mettre une par une dans $pageOK = array ..... Smiley confus

Note: je suis débutant Smiley confused
Administrateur
Hello

Qu'appelles tu include sécurisé ?

Est-ce le fait d'éviter l'inclusion d'un fichier dont le nom peut être passé en argument avec $_GET, qui ne devrait l'être et qui révélerait un contenu gênant ?

Si oui, il y a de nombreuses méthodes, mais le plus simple est de placer les fichiers pouvant être inclus dans un répertoire spécifique, d'y faire référence à l'intérieur de ton code et de valider le nom du fichier par une expression régulière du type ^[a-z0-9]$ qui n'autorise aucun caractère exotique.
Hello!
Je détaille un peu plus: j'ai lu sur un forum qu'un petit malin (ça m'arrive actuellement) peut créer un script et grâce à un include qui n'est pas sécurisé il peut modifier la page index (par exemple) avec un lien du style "http://monsite.fr/index.php?page=http://le_site_du_pirate.com/son_script.php".

Voici l'include que j'utilisai pour à peu près toutes mes pages Smiley sweatdrop
<   ?php
	
	    $page = $_GET['page'];
	    if ($page==null)
	    {
	    	$page = "mapage";
	    }

	    include "$page.php";
?    >


Aïe, j'entends déjà vos réactions, je suis sûr que c'est un mauvais code...

Le problème c'est que je ne comprends pas tout ce que j'ai pu lire et si ce que j'ai essayé est correct et me protègera:
<  ?php

$defaut = 'index';
$pages = array(
  'index'=>'index.php');
// rajouter les pages autorisées
if(empty($_GET['page'])) $page = $defaut;
else {
   $page = strtolower($_GET['page']);
   if(empty($pages[$page])) $page = $defaut;
   else $page = $pages[$page];
}

?   >


Seulement j'ai beaucoup de pages qui ne sont pas forcément toutes dans le même dossier, alors que faire? Dois-je tout mettre dans $pages = array? nCar j'ai jamais vu de code de ce genre Smiley eek
J'ai aussi lu qu'il peut en plus de modifier la page index s'il s'ennuie créer un script qui supprimera tout ce qu'il se trouve sur mon hébergeur... Houlàlà!

Merci!
Salut,

c'est vrai que ton premier code est l'exemple type qui est utilisé pour parler de cette faille de sécurité liée à la fonction include ! Smiley langue

Le plus gros risque concerne effectivement un script externe à ton site qui serait exécuté. Si tu as accès au php.ini ou si ton hébergeur te fournit un moyen de le faire tu peux t'en prémunir en passant la directive allow_url_fopen à off.

Il existe également un autre risque : celui d'afficher un contenu confidentiel de ton propre site (par exemple si j'essaie de mettre www.monsite.fr/index.php?page=../etc/.htpasswd).

La méthode suggérée par dew permet, en interdisant les slashs et les points dans $_GET['page'], d'être sûr de déterminer toi-même le chemin vers le bon répertoire qui contient les pages à inclure. Par contre ça se complique si elles ne sont pas toutes au même endroit (d'ailleurs je ne comprends pas bien comment tu fais : est-ce que tu passes des variables sous la forme ?page=repert1/mapage ? Smiley rolleyes ). Dans un tel cas tu pourrais combiner l'expression régulière à l'utilisation de 2 variables : 1 pour le répertoire et une pour la page comme par exemple ?repertoire=repert1&page=mapage

Une autre méthode est, comme tu as commencé (?) à le faire, d'utiliser un tableau :
$pages = array(
	'index' => 'index.php',
	'accueil' => 'accueil.php',
	'autre' => 'autre.php'
)
$page = !empty($_GET['page']) && array_key_exists($_GET['page'], $pages) ? $_GET['page'] : 'index'; // si la page est passée dans l'url et qu'elle existe dans la liste des pages disponibles c'est bon. Sinon on prend index par défaut
mais comme tu l'as dit toi-même ça devient vite fastidieux dès qu'on a beaucoup de pages. Dans ce cas il est grand temps d'utiliser une base de données (typiquement mysql) et de ne plus stocker les contenus à inclure dans des fichiers physiques mais dans une table. Smiley cligne


Edit: j'oubliais un pitit détail : par habitude et parce qu'on parle d'inclure des pages on a tendance à utiliser la fonction include mais en fait celle-ci n'a un intérêt que si le code inclus contient du php car celui-ci sera alors interprété. En revanche si tu n'inclus que du code html il vaut mieux utiliser la fonction readfile. Cela évite le risque d'un code php malicieux (puisqu'il sera juste traité comme du texte et non exécuté) et il ne reste plus qu'un éventuel problème de fichier local affiché en clair.
Modifié par Heyoan (19 Sep 2010 - 04:15)
Hello Heyoan, merci pour tes précisions!

Ah, je me doutais bien que ce code n'était pas recommandé...
Je connais de vue le "php.ini" mais j'avoue que je ne sais pas trop ce que c'est, mon site est hébergé chez free alors je ne sais pas où trouver ça dans le répertoire Smiley eek .

Bon pour mon site je n'ai pas vraiment de contenu confidentiel, je n'utilise même pas de systèmes où des personnes peuvent s'inscrire, poster des commentaires etc. (les problèmes viennent souvent de ça je crois d'après ce que j'ai lu), j'utilise juste un CMS (cutenews) dont j'ai enlevé la fonction de pouvoir mettre des commentaires dans mes notes. Je l'utilise plus pour sa pratique qu'autre chose. A force de lire je sais qu'il n'est pas *très* recommandé, qu'il peut être une faille (surtout qu'ils mettent pas à jour Smiley sweatdrop ) alors je voulais dans un premier temps voir si c'était mes includes qui n'étaient pas bonnes, ou si c'est ça ben, je m'en passerais... Déjà c'est sûr que j'ai dû louper quelque chose pour ça parce que bon sinon ça m'arriverait pas Smiley ohwell

Oui tu a deviné c'est comme ça que je fais pour afficher mes pages! Je veux bien utiliser une base de donnée pour les afficher mais alors là... Moi pas savoir comment faire!

Je m'étais mis au php parce qu'un ami à qui j'avais demandé des conseils m'a dit, "houla fais pas tout en .html ça te prendra bien trop de temps à modifier tes pages quand tu veux tout changer, fais en .php avec des includes comme ça, comme ci, comme ça t'aura qu'une page à modifier avec le css."

Je sais qu'il y a le css maintenant pour pas trop s'embêter quand on veut tout changer, mais il faut quand même bien quelque part inclure notre contenu dans une page? Où il faut vraiment mettre le corps du skin sur chaque page?

Je suis en train de m'embrouiller là Smiley rolleyes

Est-ce que c'est correct cette méthode au moins? Même si je n'utilise pas, comme tu dis, de code php dans mes pages à inclure? Je peux les inclure en "readfile" alors? (je sais pas trop comment Smiley ohwell )
Modifié par ladygagalove (19 Sep 2010 - 10:55)
ladygagalove a écrit :
Je suis en train de m'embrouiller là
Smiley langue C'est sûr que quand on débute ça fait beaucoup de choses à apprendre d'un coup.

Je ne connais pas cutenews donc je ne saurais pas te dire si des failles de sécurité existent. Par contre, comme je te disais, si la seule chose que tu fais en PHP consiste à inclure des pages qui ne contiennent pas de code PHP il te suffit pour le moment de remplacer
include "$page.php"; 
par
@readfile($page.'.php');
L'arrobase @ permet de ne pas afficher d'erreur si la page n'existe pas.

Ce n'est pas terrible mais c'est juste en attendant que tu en apprennes plus. Smiley cligne
D'accord, je vais essayer ça tout de suite!

Sinon, est-ce qu'il y a un tuto sur le site d'alsacreations (ou ailleurs) sur comment faire une table sur mysql? Parce que pour le moment dans mon include j'ai mis que deux ou trois pages car j'en ai beaucoup trop Smiley sweatdrop

Sinon, les includes, c'est la seule manière avec le css de pas trop s'embêter avec le skin de son site? Il n'y a pas d'autre moyen que d'utiliser des includes? Smiley confus On peut pas faire quelque chose avec le XML? (j'ai vu ça vite fait hier dans le code source de alsacreation quand j'essayais de trouver des sites qui utilisent des includes lol, parce que justement je cherche comment on peut s'en passer)

Merci! Smiley smile
Modérateur
Bonjour,

Avec Dreamweaver, tu peux utiliser le système de templates. Une template contient des zones éditables (contenu de la page) et des zones non-éditables (menu, pied de page, etc...). Si tu veux modifier le menu, tu modifies cette zone dans la template et Dreamweaver applique les changements à toutes les pages utilisant le template.
Bonjour Tony!
C'est vrai?! ça tombe bien, je l'ai, je vais essayer alors, c'est bien pratique! Merci bien pour l'information Smiley ravi

Edit: pour ne pas faire de doublon, est-ce que c'est possible de faire des adresses pour mes catégories comme par exemple alsacreations "/apprendre/"? C'est classe comme ça!
Modifié par ladygagalove (19 Sep 2010 - 18:08)