2009-07-10 8 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."; 
} 

} 

?> 

내가 필요한 페이지가 포함되어 있지만 "페이지를 찾을 수 없습니다"라는 메시지가 표시됩니다. 여기서 내가 뭘 잘못하고 있니?몇 가지 간단한 코드 문제

한 사랑

+1

메모 만 쓰려면'str_replace' 대신'basename ($ file)'을 사용해야합니다. http://php.net/basename – tj111

+0

귀하의 접근 방식이 극도로 위험하다고 말할 수 있습니다. pages/script.php에 위험한 코드가 있다고 가정 해 봅시다. 악의적 인 사람이 index.php? page = 스크립트를 웹 브라우저에 입력하면 script.php가 자동으로로드됩니다. 대신 if/else의 스위치를 사용하십시오. 코드는 훨씬 많지만 보안이 좋습니다. – usoban

답변

2

블록은 루프에서 안합니다. 또한 배열을 잘못 구성하고 있습니다. 보십시오 : 당신은 주어진 파일이 존재하는 경우 만보고 모든 요청에 ​​전체 디렉토리를 검색하지 말아야

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

.

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, 그래, 그가하려고하는 것이 실제로 보이는 것 같아. 이상하게 그는'glob' 함수를 선택했다. (사실, 지금까지는 그 함수에 대해서 들어 보지 못했다 ...). PHP와 그 핵심 기능은 수백만 가지입니다. 하하. 그리고 나는 확실히 보안을 위해 화이트리스트를 사용합니다. @Buggin Out : 즉, 허용 된 모든 PHP 스크립트로 배열을 만든 다음 요청 된 파일이 허용되는지 테스트합니다. 다른 더 안전한 방법들도 있습니다.하지만 그래요 ... 충분히 불평하고 있습니다. :-) – KyleFarris

1

내가 이런 식으로 할 거라고 : 한 번만 세션 당 페이지 목록을로드하고 청소를 위해 명시 적 루프를 제거한다

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

를 특정 파일이 존재하는지 그냥 확인 glob에서 페이지 이름.

관련 문제