Faille include

Eléphant du PHP | 114 Messages

24 avr. 2006, 13:12

Bonjour
J'ai un site où j'inclus mes pages comme ceci :
if(isset($_GET['page']) AND file_exists($_GET['page'].'.php')){
	
	include $_GET['page'].'.php';
	}
else {include('acceuil.php');}
Et si dans l'url je fais par exemple index.php?page=../un fichierexistant

donc d'un autre répertoire, il s'inclut bien.
Je me demande comment éviter ça ?
En clair comment faire pour que le fichier à inclure soit existant, mais dans le dossier en cours...

Autrement qu'en faisant un truc de ce style :
if ($page == connection) {include('connection.php;}
if ($page == fichier) {include('fichier.php;}
etc...
parceque la liste serait longue.
Merci

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

24 avr. 2006, 13:15

Tu vérifie qu'il n'y ai pas le caractère \ dans l'url

Vu que c'est le séparateur dans une url, s'il n'est pas présent, c'est qu'on est dans le même répertoire
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

24 avr. 2006, 14:29

Ou de caractère /
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

24 avr. 2006, 14:31

Ou de caractère /
:oops: autant pour moi
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 64 Messages

24 avr. 2006, 14:49

Salut,

Perso, j'utilise une methode qui marche bien lol :

voici le code
<?php

if(isset($_GET['page']))
{
include('/pages/'.$_GET['page'].'.php');
}

?>
En fait je place juste toutes les pages de mon site dans un repertoire, et perso sa marche bien, enfin moi je propose sa, mais c'est a toi de voir

ou sinon la methode que jutilisai au debut, ( phpdebutant )

on créé un tablo avec toutes les pages autorisé

et apres on verri si la page se trouve bien dans le tableau, si oui, on l'inclu

http://phpdebutant.org/article68.php

Voila j'espere t'avoir aidé

Invité
Invité n'ayant pas de compte PHPfrance

24 avr. 2006, 17:58

Tu vérifie qu'il n'y ai pas le caractère \ dans l'url
Et oui en fait c'est tout c**

Mais là il s'agit d'une partie que je ne maitrise vraiment pas, alors je ne sais comment faire.
Pourriez vous me dépanner, ou m'indiquer où je peu trouver un petit "cours" là dessus ?

En tout ca merci beaucoup.

Eléphant du PHP | 114 Messages

24 avr. 2006, 18:52

Désolé pour le message précédent, j'ai pas vu que je n'étais pas connecté.

Au final j'ai fais ça :
if (eregi("/",$_GET['page'])){include('acceuil.php');}
else {
	if(isset($_GET['page']) AND file_exists($_GET['page'].'.php')){
		include $_GET['page'].'.php';
		}
	else {include('acceuil.php');}
}
Ca fait pas terrible mais ça marche. :roll:

Eléphant du PHP | 64 Messages

24 avr. 2006, 20:14

 <?php

if(isset($_GET['page']) && file_exists('/pages/'.$_GET['page'].'.php'))
{
// On place toutes les pages du site dans le repertoire /pages
include('/pages/'.$_GET['page'].'.php');
}
else
{
include('home.php');
}
?>
Je pense que c'est une des meilleurs solution niveau securité, enfin a toi de juger

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

25 avr. 2006, 09:34

@mafio : et si je donnes la valeur '../autre/rep/fichier.php' :?: ça va fonctionner sauf qu'on sort du répertoire page ;)

Je pense que la détection du caractère / est indispensable

Ensuite, pour une simple recherche de caractères, strpos() sera plus performant que eregi()
if (strpos("/",$_GET['page']) === FALSE){
  include('acceuil.php');
} else {
    if(isset($_GET['page']) AND file_exists($_GET['page'].'.php')) {
        include $_GET['page'].'.php';
    } else {
      include('acceuil.php');
    }
}
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

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

25 avr. 2006, 10:26

Personnellement, ce n'est pas le caractère "/" que je recherche, mais les "../" (voire juste "./").

Cela me permet de structurer le dossier dans lequel sont les pages avec d'éventuels sous dossier (plus pratique à mon sens pour m'y retrouver dans mes pages :)).

La variable $_GET['page'] peut ainsi prendre la valeur dossier/page pour aller chercher la page "page.php" du dossier "dossier", mais jamais remonter dans les dossier parents :)

Eléphant du PHP | 114 Messages

26 avr. 2006, 07:03

Bonjour
pour une simple recherche de caractères, strpos() sera plus performant que eregi()
J'étais donc pas loin.
Merci à tous.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

26 avr. 2006, 09:25

@Ryle : pas con ton idée :-k

J'aime bien. On pourrait se limiter à la recherche de './' ('../' etant inclu) et on peut permettre une arborescence.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer