Faille include()

Profil bloqué -  
 Profil bloqué -
Bonjour,
J'ai cherché pas mal de choses sur la faille de l'include, afin de résoudre cet éventuel problème, mais je n'ai pas trouvé LA solution.

J'aimerais savoir comment sécuriser ce type de code :

<?php include ("page.php"); ?>

Et :

$test=$_GET['test'];
if($test ==04)
{
include 'dossier/page.php';
}

Meci d'avance

A voir également:

3 réponses

Kcazer Messages postés 26 Statut Membre 21
 
Bonsoir,

Les failles sur les includes viennent bien souvent d'une négligence dans la programmation des pages.
Je pense par exemple à une source de ce genre:
<?php // blah début php
$page = $_GET['page']; // On recup l'argument 'page' depuis l'url
include($page); // Et on inclus directement ce qui est donné en parametre
?>

Il s'agit ici d'une erreur enorme, à ne JAMAIS faire.
En effet dans cet exemple il devient posible pour n'importe qui d'inclure son propre code dans vos pages, autant dire que tout, ou presque, deviens possible.
Un methode simple, mais efficace, pour contourner ce genre de probleme, consiste à passer par "une liste" de pages autorisée (l'utilisation d'une structure switch est la plus simple a mettre en place)
$page = $_GET['page']; // On recup le nom de la page
switch($page) {
 case 'inscription': include('inscription.php'); break;
 case 'login': include('login.php'); break;
 ...
 default: include('page_principale.php');
}

Dans cette exemple, seul les cas truc.php?page=inscription, truc.php?page=login, et les autres cas traités dans le switch seront inclus. Pour toutes les autres demandes, un page par défaut (page_principale.php) sera utilisée.
Une sécurité supplementaire pourrait etre de ne pas utiliser le meme nom pour l'argument et pour le fichier, comme ici:
$page = $_GET['page']; // On recup le nom de la page
switch($page) {
 case 'inscription': include('5GO0ND.EXT'); break;
 case 'login': include('9DLOJU.EXT'); break;
 ...
 default: include('APXH62L.EXT');
}

On peut egalement placer les includes dans un sous dossier protégé par .htaccess

Pour en revenir à ton exemple, php faisant les conversions chaines<=>nombres à la volée, une page du genre truc.php?test=4ghgcs sera equivalente à truc.php?test=04. Pour eviter ça, tu pourrais faire quelque chose de ce genre:
$test=$_GET['test']; 
if($test == '04' ) { 
 include 'dossier/page.php'; 
}


A noter aussi que le code seul:
<?php include ("page.php"); ?>

ne pose aucun problème du moment que la page appellante, et la page incluuse, ne presentent elles meme pas de failles.

Voilà ,je pense avoir répondu à ta question :]

ps: oula, ça c'est du pavé...
3
Profil bloqué
 
Bonjour, et merci pour ta réponse très instructive.
J'ai lu attentivement ton message, et je pense avoir bien compris le fonctionnement.

Avec mon exemple :

$test=$_GET['test'];
if($test ==04)
{
include 'dossier/page.php';
}

=> Qui n'est pas sécuriser ?
_Epxposition du problème :

On dit que $tes accepte des nombres de 01 à 04.
Si je veux include un fichier -.txt a chaque fois, est-ce que je laisse :

$test=$_GET['test'];
if($test ==01)
{
include 'dossier/page1.txt';
} 
$test=$_GET['test'];
if($test ==02)
{
include 'dossier/page2.txt';
} 
$test=$_GET['test'];
if($test ==03)
{
include 'dossier/page3.txt';
} 
$test=$_GET['test'];
if($test ==04)
{
include 'dossier/page4.txt';
} 


Est-ce suffisant niveau sécurité, si je fais un lien du type ?

test.php?test=01

?
Et une dernière question, en ce qui concerne la technique du .htaccess, que faudrait-il que je mette pour sécuriser les fichiers ?
J'ai déjà modifier un paramètre dans php.ini

Merci
Merci d'avance
1
Kcazer Messages postés 26 Statut Membre 21
 
Dans ce cas, il n'y a pas a proprement parler de faille de sécurité.
Seulement des ambiguité sur le traitement de certaines pages (comme par exemple test.php?test=3bhcd qui serait equivalente à test.php?test=03)

Pour éviter ces ambiguité, utilise plutot des chaines pour les comparaisons.
if($test == '04') plutot que if($test == 04)

L'utilisation d'un switch simplifiera la lecture (et tres legement la vitesse d'execution du script), et permettra d'assigner une page par defaut à afficher en cas d'argument corrompu.
$test=$_GET['test'];
switch ($test) {
 case '01': include('dossier/01.txt'); break;
 case '02': include('dossier/02.txt'); break;
 case '03': include('dossier/03.txt'); break;
 case '04': include('dossier/04.txt'); break;
 default: include('dossier/erreur.txt');
}


Ensuite pour proteger le dossier contenant tes includes, il suffit de creer un fichier .htaccess et de mettre dedans:
order allow,deny
deny from all
Il suffit ensuite de mettre ce fichier dans le dossier à proteger.
0
Profil bloqué
 
Merci de tes réponses très utiles, je testerais tout cela dans la soirée, en attendant, merci beaucoup ! et bonne nuit !
1