2009-07-10 7 views
1

C'est très sacrément sûr non? Quelque chose que j'ai manqué?L'entrée de l'utilisateur comprend

$page = sprintf("%s/%s.php", "pages", $_GET['page']); 
if (file_exists($page)) { 
    include $page; 
} 
else { 
    echo "The page '$page' does not exist =("; 
} 

(oui, vous pouvez l'utiliser)

+0

Vous souhaitez probablement supprimer les barres obliques, les espaces, les points ou tout ce qui peut être utilisé comme directive dans le système de fichiers. – thesmart

Répondre

4

La « meilleure » façon de le faire est d'avoir un tableau des pages autorisées, faire quelque chose comme ceci:

$page = $_GET['page'] . '.php'; 
if(in_array($page, $all_pages)) { 
    include('pages/' . $page); 
} 

Vous pouvez facilement obtenir une liste de toutes les pages autorisées en faisant quelque chose comme ça :

$all_pages = glob('pages/*.php'); 

Documentation: in_array, glob

+0

c'est intelligent, merci –

4

Il est dangereux car un utilisateur peut charger arbitrairement quelle page ils se sentent comme.

0

si vous êtes sûr qu'il n'y a pas / ou .. dans $_GET['page'], et que le visiteur est autorisé à consulter un fichier php dans le pages dir, je pense qu'il est correct.

0

Utilisez basename() pour vous assurer qu'il n'y a aucune information de chemin étant fourni:

$page = sprintf("%s/%s.php", "pages", basename($_GET['page'])); 
if (file_exists($page)) { 
     include $page; 
} 
else { 
     echo "The page '$page' does not exist =("; 
} 
Questions connexes