2012-09-19 2 views
0

빌드하는 페이지에서 URL 끝에 변수에 따라 페이지의 일부로 파일을로드해야합니다. 예를 들어, 페이지 URL이 test.php? page = lp이면 페이지에 lp.php 파일이 포함될 것입니다 ...... 이제는 잠시 동안 작동했지만 갑자기 멈추었을뿐입니다. 파일이없는 것처럼 오류가 반환됩니다. 파일이 "찾을 수 없습니다"이라면 그렇게라는 메시지가 표시 될 수 있도록 나는 다음과 같이 스크립트까지 'prettied'PHP에서 URL 변수가 잘못 포함됩니다.

<?php $times = substr_count($_SERVER['PHP_SELF'],"/"); 
$rootaccess = ""; 
$i = 1; 

while ($i < $times) { 
$rootaccess .= "../"; 
$i++; 
} 
$y = date("Y"); 
$ymo = $y-1; 

//$rootaccess. 
if(!file_exists($page.".php")){ 
echo "The file requested (www.websitename.co.uk$rootaccess$page.php) was not found, or an error occured"; 

} 
else {include($rootaccess.$page.".php");} ?>  

을 그리고 일어나는 모든 파일이없는 경우에 대한 결과입니다 found가 throw됩니다 ... 그래서 test.php? page = lp의 예제에서 "요청 된 파일 (www.websitename.co.uk/lp.php)을 찾을 수 없거나 오류가 발생했습니다"라는 메시지가 반환됩니다. 그러나 AJAX 링크를 사용하여 정확히 같은 위치에 똑같은 파일을로드하면 페이지가 AJAX를 사용하기 때문에 파일이 있습니다. (마찬가지로 내가 오류 표시에 주소 표시를 입력하면 작동합니다.) 이렇게하면 페이지의 다른 요소도 변경되므로 $ page가 설정되었는지 확인하기 위해 스크립트에서 GET 명령을 사용했습니다. ..하지만 어떤 이유로 더 이상 파일을 포함하지 않으려 고합니다 - 그래서 이것에 대한 해결책은 무엇입니까? (나는 rootaccess 비트도없이 시도했지만, 여전히 실패했다.) 고마워. (또한 누구나 include ($ rootaccess. $ page. ".php")가 언젠가는 작동하고 다음 번에는 작업을 중단한다면 그 순간 나는 내가 알고 있기를 바랍니다. 그냥 페이지가 작동하는 것을 외치며 !!!)

+1

당신의 호스트에'register_globals'가 켜져있을 때 내기를했기 때문에'$ page'에 전역으로 직접 접근 할 수 있습니다. 대신에'$ _GET [ 'page']'를 사용하십시오. 그러나'../'와 같은 문자열 값에 대해 필터링하지 않으면 디렉토리 탐색 공격에 노출되어 파일 시스템에있는 읽을 수있는 파일이 웹에 노출 될 수 있습니다. –

답변

0

나는 전에 똑같은 문제를 발견했다고 생각한다. 다음을 사용하십시오 :

$foo = trim($page.".php"); 

if(!file_exists($foo)) { 
    : 
} else { 
    include(trim($rootaccess.$foo)); 
} 
+0

그게 효과가있는 것 같습니다. 페이지 새로 고침에 여전히 오류가 발생하지만 AJAX와의 이상한 충돌이 될 수 있습니다. JS를 사용하지 않는 사용자가 파일을로드 할 수 있으면 그때까지 행복합니다. –