Bazı basit kod ile sorun

3 Cevap
<?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.";
}

}

?>

Bunun için dediğim sayfayı içermez ama o da "Sayfa bulunamadı" yankıları. Ben burada yanlış ne yapıyorum?

Bir aşk

3 Cevap

Eğer blok döngüde olmamalıdır. Ayrıca, yanlış dizi inşa ediyoruz. Deneyin:

<?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.";
}

Belirli bir dosya varsa sadece görmek için her istek üzerine bütün dizin göz olmamalıdır. Bu özel dosya varsa sadece kontrol:

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
    }
}

Ben böyle yapardım:

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.';
}

Bu sadece oturum başına bir kez sayfaların listesini yükler ve glob gelen sayfa adlarını temizlemek için açık döngü kurtulur.