2013-07-17 9 views
0

나는 모든 요청을 방문자가 요청한 URL을보고 일치시킬 템플릿 파일이 있는지 확인하는 index.php 파일을 통해 리디렉션하고 있습니다.PHP pathinfo에 기반한 파일 - 보안 문제가 있습니까?

예를 들어, http://www.website.com/contact은 실제로 index.php 스크립트로 라우팅되며 /var/html/template/contact.tpl 파일이 있는지 확인하고 포함되어 있는지 확인해야합니다.

내 관심사는 보안 및 null 문자, 여분의 점 및 슬래시 등에 관한 것입니다. 어떤 종류의 필터가 아래 코드에 적용해야합니까? 아니면 pathinfo 및 디렉토리 접두사를 충분히 사용합니까? 분명히 나는 ​​누군가가 악의적으로 지정된 템플릿 디렉토리 외부에 파일을 포함 할 수 없도록하고 싶다.

<?php 

define ('TEMPLATES', '/var/html/templates'); 

$page = pathinfo ($_SERVER['REQUEST_URI'], PATHINFO_FILENAME); 

if (file_exists (TEMPLATES . '/' . $page . '.tpl')) { 
    include (TEMPLATES . '/' . $page . '.tpl'); 
} else { 
    header ('HTTP/1.0 404 Not Found'); 
    echo 'Sorry page not found'; 
} 

?> 

답변

3

100 % 안전하려면 페이지를 반환하기 전에 허용 된 페이지의 목록을 만들고 해당 배열에 있는지 확인하십시오.

당신은 PHP를 glob()을 시도 할 수 있습니다 예를 들어

define ('TEMPLATES', '/var/html/templates/'); 

$page = TEMPLATES . pathinfo($_SERVER['REQUEST_URI'], PATHINFO_FILENAME) . '.tpl'; 

if (in_array($page, glob(TEMPLATES . '*.tpl'))) { 
    include ($page); 
} else { 
    header ('HTTP/1.0 404 Not Found'); 
    echo 'Sorry page not found'; 
} 

이가 확장 '.tpl'

죄송합니다 것을 해당 폴더의 것을 확인한다 -. 단지 글로브를 만들기 위해 편집() 행동 올바른.

+0

요청할 때마다 글로브 처리 하시겠습니까? 그다지 좋은 선택이 아닙니다. – Gumbo

+0

당신 말이 맞아요 - 초고속 아니지만 더 많은 포인트를 보여 주었다. 내 답변의 첫 번째 문장은 내 권장 솔루션 것입니다. 프로덕션 환경에서 glob가 사용 되었다면 성능 향상을 위해'GLOB_NOSORT' 플래그를 사용하는 것이 좋습니다. – calcinai

+0

답장을 보내 주셔서 감사합니다. 이전에는 일종의 "화이트리스트"를 제안대로 사용했지만 이상적으로는 새 페이지/템플릿이 만들어 질 때마다 화이트리스트를 업데이트하고 싶지 않습니다. – MrCarrot