2009-07-10 6 views
1
<?php 

// get all files from pages/ with .php extension 
$pages = glob('pages/*.php'); 

foreach ($pages as $page) { 

// remove path 
$page_clean = str_replace('pages/', '', $page); 

// put it in an array 
$allowed_pages = array($page_clean); 

// determine that the lank will be index.php?page=% 
$page = $_GET['page'] . '.php'; 

// load page 
if(in_array($page, $allowed_pages)) { 
    include('pages/' . $page); 
} else { 
echo "Page not found."; 
} 

} 

?> 

Il inclut la page que j'appelle mais il renvoie également "Page non trouvée". Qu'est-ce que je fais mal ici?Problème avec un code simple

Un amour

+1

juste une note, vous devriez utiliser 'basename ($ file)' au lieu de 'str_replace'. http://php.net/basename – tj111

+0

Puis-je dire que votre approche est extrêmement dangereuse. Disons que vous avez un code dangereux dans pages/script.php, un méchant pourrait simplement taper index.php? Page = script dans le navigateur web et script.php serait automatiquement chargé. Utilisez switch de if/else si à la place, c'est beaucoup plus de code mais plus sûr. – usoban

Répondre

2

Le bloc if ne doit pas être dans la boucle. En outre, vous construisez le tableau incorrectement. Essayez:

<?php 

// get all files from pages/ with .php extension 
$pages = glob('pages/*.php'); 

$allowed_pages = array(); 
foreach ($pages as $page) { 
    // remove path 
    $page_clean = str_replace('pages/', '', $page); 

    // put it in an array 
    $allowed_pages[] = $page_clean; 
} 

// determine that the lank will be index.php?page=% 
$page = $_GET['page'] . '.php'; 

// load page 
if(in_array($page, $allowed_pages)) { 
    include('pages/' . $page); 
} else { 
    echo "Page not found."; 
} 
2

Vous ne devriez pas parcourir le répertoire entier à chaque requête pour voir si un fichier existe. Il suffit de vérifier si ce fichier spécifique existe:

if (strpos($page, '..') !== false || strpos($page, '/') !== false) { 
    // invalid value, but you better use a whitelist than a blacklist like I did 
} else { 
    if (is_file('pages/'.$page.'.php')) { 
     // file exists 
    } else { 
     // file doesn’t exist 
    } 
} 
+0

+1, Oui, il semble vraiment que c'est ce qu'il essaie de faire. Bizarre qu'il ait choisi la fonction 'glob' (en fait, je n'ai jamais entendu parler de cette fonction avant aujourd'hui ...). PHP et c'est fou des millions de fonctions de base, haha. Et je suis d'accord, certainement utiliser une liste blanche pour la sécurité. @Buggin Out: Cela signifie faire un tableau complet de tous les scripts PHP autorisés, puis tester pour voir si le fichier demandé est autorisé. Il y a d'autres manières plus sûres aussi ... Mais, ouais ... assez de rancœur. :-) – KyleFarris

1

Je ferais comme ça:

if(!isset($_SESSION['allowed_pages'])) { 
    $_SESSION['allowed_pages'] = array_map('basename', glob('pages/*.php')); 
} 
$page = $_GET['page'] . '.php'; 

if(in_array($page, $_SESSION['allowed_pages'])) { 
    include("pages/$page"); 
}else { 
    echo 'Page not found.'; 
} 

qui charge uniquement la liste des pages une fois par session et se débarrasse de la boucle explicite pour le nettoyage les noms de pages du glob.