[php] Avis sur la sécurité de mon code (include)

WRInaute discret
Bonjour à tous,

Je voulais avoir votre avis sur la sécurité (ou l'insécurité) de ce bout de code :

Code:
$p='';
if (isset($_GET['page'])) $p=$_GET['page'];
if (!empty($p) && file_exists('rep/'.$p.'.php')) include('rep/'.$p.'.php');
else include('accueil.php');

Depuis mon index j'appelle différentes pages qui viennent s'ouvrir dans le centre de celui-ci (pseudo frame). Evidemment cela implique d'éventuels problèmes de sécurité.
N'étant pas du tout un hacker averti, je voulais savoir si ce code est exploitable par une personne mal attentionée ? :twisted:

Merci d'avance
 
Nouveau WRInaute
Salut,

On peut inclure n'importe quelle page php de ton site et pas seulement dans le répertoire "rep".

exemple : ?page=../rep_admin/index

++
 
WRInaute discret
Kaio a dit:
Salut,

On peut inclure n'importe quelle page php de ton site et pas seulement dans le répertoire "rep".

exemple : ?page=../rep_admin/index

++

Je suis en local uniquement pour l'instant et quand j'appelle un fichier en dehors du repertoire 'rep' je retombe pourtant sur la page d'accueil.
(mais comme je précise je suis pas hacker ...)

et comment je peux y rémédier, via un array qui liste les pages autorisés ?
 
WRInaute discret
J'ai rajouté ceci

Code:
$p='';
if (isset($_GET['page'])) $p=$_GET['page'];
$pageok = array('', 'accueil', 'page1', 'page2'....);
if (!in_array($p, $pageok)) { 

   include('accueil.php');
}
if (!empty($p) && file_exists('rep/'.$p.'.php')) include('rep/'.$p.'.php');
else if (!empty($p) && file_exists($p.'.php')) include($p.'.php');
else include('accueil.php');

Est-ce suffisant ?[/quote]
 
WRInaute passionné
j'éviterai ce type de shema

le mécanisme empêche potentiellement une injection jusqu'au jour ou l'on découvre un bug sur une fonction

et la ton filtre saute et tu es vulnerable

faut savoir que les caractères du style ? & @ et # modifient les interprétations d'url

pour injecter ton site faudrait bugger in_array et file_existe ce qui n'est pas possible actuellement (à ma connaissance)

mais la vraie solution est d'inclure une constante

rog
 
WRInaute passionné
aie

une variable est une donnée qui est modifiable
une constante est une donnée que l'on ne peut modifier

voir define

rog
 
Nouveau WRInaute
Tu aurais pu simplement virer les "../" de ta variable $p

Faire un tableau c'est bien mais pas vraiment pratique puisque tu dois ajouter chaque nouvelle page que tu autorises...

Le mieux c'est de faire de l'url rewriting. Si on tente de se ballader sur ton site par l'include avec du "../" ça ne marche pas car le serveur tente d'abord de changer de répertoire... 8)
 
WRInaute discret
rog a dit:
aie

une variable est une donnée qui est modifiable
une constante est une donnée que l'on ne peut modifier

voir define

rog

lol, j'étais parti sur complétement autre chose ...

Faire un tableau c'est bien mais pas vraiment pratique puisque tu dois ajouter chaque nouvelle page que tu autorises...

Le mieux c'est de faire de l'url rewriting. Si on tente de se ballader sur ton site par l'include avec du "../" ça ne marche pas car le serveur tente d'abord de changer de répertoire...

Oui l'array n'est pas ultra pratique, mais le nombre de page que je devrais autoriser sera limité

Et j'utilise aussi l'url rewriting

8)

Merci pour vos réponses
 
Discussions similaires
Haut