2009-05-11 2 views
7

PHP에서 간단한 디렉토리 목록 스크립트를 구현하고 있습니다.PHP에서 사용자 정의 경로가 안전한지 확인하십시오.

내가 전달 경로가 디렉토리 핸들을 열고 echo가 다짜고짜 결과를 보내고 전에 안전한지 확인하고 싶다.

$f = $_GET["f"]; 
if(! $f) { 
    $f = "/"; 
} 
// make sure $f is safe 
$farr = explode("/",$f); 
$unsafe = false; 
foreach($farr as $farre) { 
    // protect against directory traversal 
    if(strpos($farre,"..") != false) { 
     $unsafe = true; 
     break; 
    } 
    if(end($farr) != $farre) { 
     // make sure no dots are present (except after the last slash in the file path) 
     if(strpos($farre,".") != false) { 
      $unsafe = true; 
      break; 
     } 
    } 
} 

사용자가 보낸 경로가 안전한지 확인하거나 공격으로부터 보호해야하는 다른 작업이 있습니까?

+1

foreach() – Greg

+0

에서 변수를 전환했습니다. O를 선택해 주셔서 감사합니다. –

답변

9

realpath()이 도움이 될 수 있습니다.

realpath() 모든 심볼릭 링크 을 확장하고 '/./'에 대한 참조를 해결의 입력 경로에 '/../' 및 추가 '/' 문자를하고 정규화 절대 경로를 반환합니다.

그러나이 함수는 문제의 경로가 실제로 있다고 가정합니다. 존재하지 않는 경로에 대해서는 정규화를 수행하지 않습니다. 이 경우 FALSE가 리턴됩니다.

+0

전달 된 경로에서 realpath()를 수행하고 내 '안전한'디렉토리 아래에 있는지 확인하십시오. –

+0

정확합니다. 당신이 다시 말도 안되는 (또는 거짓) 경로를 얻었 기 때문에, 당신은 수표와 간단한 부분 문자열 비교를 할 수 있습니다. – Tomalak

+0

나에게 좋은 소리. 감사! –

관련 문제