2009-02-08 4 views
3

페이지를 모두 배열에 넣지 않고 안전하게 포함시킬 수있는 방법이 있습니까?동적 포함 안전 ​​

 
if (preg_match('/^[a-z0-9]+/', $_GET['page'])) { 

$page = $_GET['page'].".php"; 
$tpl = $_GET['page'].".html"; 
if (file_exists($page)) include($page); 
if (file_exists($tpl)) include($tpl); 

} 

매우 안전하게 만들려면 어떻게해야합니까?

나는 모든 페이지에 포함되어야하는 내용을 포함하지 않아도되기 때문에 이렇게하고 있습니다. "include header> content>"footer "를 포함합니다. 어떤 템플릿 엔진/프레임 워크도 사용하고 싶지 않습니다.

감사합니다.

답변

6

현재 구현의 약점은 "index"는 것,

  1. 정규 표현식 단지 문자열의 시작을 테스트, 그래서 "images/../../secret은"통과 것이고, 더 검증없이
  2. ...이다 유효한 값이어야하며 재귀를 일으킬 수 있습니다.

이 모든 것을 넣어하는 것이 좋습니다의, 구현 안전하게하려면, 그 (예를 들면 "includes"와 "templates") 자신의 디렉토리에 포함하기위한 것입니다. 이를 토대로이 디렉토리에서 벗어날 방법이 없는지 확인해야합니다.

if (preg_match('/^[a-z0-9]+$/', $_GET['page'])) { 
    $page = realpath('includes/'.$_GET['page'].'.php'); 
    $tpl = realpath('templates/'.$_GET['page'].'.html'); 
    if ($page && $tpl) { 
     include $page; 
     include $tpl; 
    } else { 
     // log error! 
    } 
} else { 
    // log error! 
} 

주 : 파일이 다른 존재 false 경우 realpath 지정된 상대 경로에 절대 경로를 반환합니다. 따라서 file_exists은 필요하지 않습니다.

4

배열에 사용 가능한 페이지 목록을 저장하지 않으려는 것에 대해 언급 한 내용에도 불구하고 최상의 비 데이터베이스 솔루션이 될 가능성이 높습니다.

$availFiles = array('index.php', 'forum.php'); 
if(in_array($_GET['page'].".php", $availFiles)) 
{ 
    //Good 
} 
else 
{ 
    //Not Good 
} 

쉽게 DB 쿼리 중 하나 또는 사용 가능한 원하지 않는 파일을 읽거나 심지어 디렉토리의 내용을 읽고 일을 필터링하여이 동적 배열을 만들 수있다.

+0

와우 나는이 답변을 게시하고 새로 고침했으며 이미 의견을 게시했습니다. – UnkwnTech

+0

+1; 디렉토리 내용을 읽고 내용을 필터링하는 것은 좋은 매개체입니다. – Rob

+1

디렉토리 내용을 읽고 내용을 필터링하면 구현을 수정하기 위해 앱을 반환 할 수 있습니다. 100,000 명의 사용자가있는 경우 계속 파일 사용 권한을 읽으십니까?이 게으름 뱅이가되고 접착제 코드 또는 처리 할 항목이 생성되면 캐시하십시오. – Syntax

0

나는 Unkwntech에 동의합니다. 이것은 웹 사이트에 파일을 포함하는 것과 같은 안전하지 않은 방법입니다. PHP 프로그래머가 모두 제거 할 수 있기를 바랍니다. 그럼에도 불구하고 가능한 모든 일치 항목이있는 배열이 확실히 안전합니다. 그러나 이 더 잘 작동하고 더 안전하다는 것을 알게 될 것입니다. code igniter을 다운로드하고 튜토리얼 또는 두 가지를 사용하면 동적 인 포함을 사용하는 것과 같은 이유로 그것을 좋아할 것입니다.

1

포함에 사용자가 제공 한 정보를 사용하지 마십시오. 이 작업을 수행하는 일종의 요청 처리기가 항상 있어야합니다. 정규 표현식은 일부를 필터링 할 수 있지만 모든 것을 필터링하지는 않습니다.

사이트를 해킹하지 않으려면 사용자가 포함을 지정하여 응용 프로그램의 흐름을 제어 할 수 없습니다.

+0

정규 표현식은 어떤 것들을 필터링하지 않을까? – Shabbyrobe