2012-05-05 3 views
1

안전합니까? 또는 RFI/LFI를 사용할 수 있습니까?안전한 PHP 포함

$request_uri = explode('/', $_SERVER['REQUEST_URI']); 
$script_name = explode('/', $_SERVER['SCRIPT_NAME']); 

for ($i = 0; $i < sizeof($script_name); $i++) { 
    if ($request_uri[$i] == $script_name[$i]) 
    { 
     unset($request_uri[$i]); 
    } 
} 

$command = array_values($request_uri); 

if (file_exists('controllers/' . $command[0] . '.php')) { 
    include 'controllers/' . $command[0] . '.php'; 
} 

갱신 :

if (isset($_GET['p'])) { 
    $pages = array('home', 'login', 'register'); 
    $page = filter_var($_GET['p'], FILTER_SANITIZE_URL); 

    if (in_array($page, $pages) && file_exists($page . '.php')) { 
     include ($page . '.php'); 
    } else { 
     include ('404.php'); 
    } 
} 
else { 
    include ('home.php'); 
} 
+0

적어도 하나 또는 다른 디렉토리에있는 모든 읽을 수있는 PHP 파일을 쉽게 읽을 수 있습니다. – hakre

+1

해당 코드를 사용하지 마십시오. – goat

답변

1

글쎄, $command[0]에 영숫자 (및 밑줄 및 하이픈) 만 포함되어 있다면 이 다소 안전 할 수 있습니다.

if (!ctype_alnum($command[0])) { 
    // Hacking attempt! 
    exit; 
} 

을하지만 여전히 사용자 입력을 기반으로 파일을 포함하는 나쁜 생각 : 다음과 같은

뭔가 일을 할 수 있습니다. URI를 컨트롤러에 매핑하는 조회 테이블을 사용하고 autoload를 사용하여 관련 파일을 포함하는 것이 더 좋습니다. 이렇게하면 사용자 입력과 포함 사이에 강력한 구분이 있습니다.

+0

어떨까요 : (질문 사항 확인) } – John

+0

업데이트가 더 좋았습니다. 'filter_var()'는 화이트리스트를 확인하기 때문에 중복됩니다. – kijin

+0

URL에 'or'을 추가하면 페이지가 발견되지 않는 이유는 무엇입니까? (http : // localhost/url/http : // localhost/url)/'does not work (사이트를 찾을 수 없습니다) 왜? – John