include et gestion d'erreurs

Petit nouveau ! | 3 Messages

17 oct. 2010, 09:46

Bonjour,
Je rencontre des soucis avec la fonction include.
J'ai essayé de sécurisé le site à l'aide de set_include_path (trop de pages pour que je les autorise une par une).
Le code est le suivant :
<?php
	//definition des includes
set_include_path('rep1'.PATH_SEPARATOR.'rep2'.PATH_SEPARATOR.'rep3'.PATH_SEPARATOR.'rep4'.PATH_SEPARATOR.'rep5'.PATH_SEPARATOR.'rep6'.PATH_SEPARATOR.'rep7'.PATH_SEPARATOR.'rep8');
//fin definition des includes
 
  if(!empty($_GET['page']))
  {
           include($_GET['page']);
    }
    else
  {
    // Sinon, on affiche la page d'accueil par défaut
    include('default.html');
  }
?>
Pas de souci de ce côté là, mais je voudrais que si on appelle une page qui n'existe pas, on soit renvoyé sur une page d'erreur 404 personnalisée, plutôt que d'afficher le warning... J'ai essayé avec un file_exists, mais dans ce cas, le site ne charge plus aucune page et renvoie à chaque fois sur la page d'erreurs...
Je suis preneur d'une idée pour me dépanner... !
Merci d'avance !

Christophe

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

17 oct. 2010, 09:55

Avant l'include, tu peux tester si le fichier que tu veux inclure existe ou non avec file_exists() :) (et donc gérer lorsque celui-ci n'existe pas :))

Je suis pas un fan des listes de pages autorisées qu'il faut systématiquement mettre à jour, mais par contre un peu de sécurité ne fait pas de mal. Du coup dans la mesure du possible je contrôle la valeur passée par l'utilisateur avant d'inclure le fichier pour m'assurer qu'elle ne contient pas de "http", "../", etc. qui lui permettrait d'inclure des pages tiers ou de se balader dans mon arborescence et d'ouvrir n'importe quel fichier :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 3 Messages

17 oct. 2010, 11:38

Merci pour la réponse !
J'ai essayé avec file_exists, mais ça ne fonctionne pas :
 if(!empty($_GET['page']))
  {
if (file_exists($_GET['page']))
{
           include($_GET['page']);
    }
else
{
          include(erreur.html);
}
    else
  {
    // Non, on affiche la page d'accueil par défaut
    include('default.html');
  }
dans ce cas, le script donne à chaque fois la page d'erreur...

ViPHP
xTG
ViPHP | 7331 Messages

17 oct. 2010, 12:48

Cela me chiffone que tu dises que cela ne fonctionne pas.
Car si le include fonctionne avec un chemin file_exists devrait aussi fonctionner avec ce même chemin.
On ne peut inclure un fichier qui n'existe pas. ;)

Mammouth du PHP | 19672 Messages

17 oct. 2010, 13:10

Peut-être qu'effectivement le fichier n'existe pas... là où tu le cherches. file_exists va chercher dans le même répertoire que celui contenant le code en cours d'exécution. Si le fichier à rechercher est ailleurs, il faut indiquer le chemin.

J'ai aussi un doute : est-ce que ton paramètre dans l'url ressemble à « page=mapage » ou bien à « page=mapage.html » ?
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Petit nouveau ! | 3 Messages

17 oct. 2010, 19:18

Les fichiers existent bien, et sont chargés sans problème si je ne fais pas le test avec file_exists...
Les url sont du type ?page=machin.html
Merci d'avoir pris le temps de vous penchez sur mon problème...