2016-08-28 7 views
-2

URL을 요청하면 웹 페이지가 생성됩니다. (css,js) include으로 해봤지만, 해커가 public_html이 아닌 파일을 포함시킬 수 있으므로 위험합니다. file_get_contents에서 시도해 보았습니다. 완벽하지만 나는 실제로 내가 file_get_content이 위험한 것을 듣고 있기 때문에 확신하고 싶다. 내가 해커가 PHP 파일을 읽는 것을 돕고 싶지 않다. file_get_contents으로 가능하다고 들었기 때문에?file_get_contents로 PHP 파일을 읽을 수 있습니까?

+0

사용 권한이 주어진 한 ** 모든 ** 파일은'file_get_contents'로 읽을 수 있습니다. 화이트리스트를 사용하여 요청한 파일과 비교하여 읽으려는 파일 만 외부로 나가야합니다. –

답변

0

file_get_contents()은 사용자가 입력 한 데이터를 매개 변수로 사용하여 출력 할 때 위험 할 수 있습니다. 그러면 악의적 인 사용자는 예를 들어 다음을 사용할 수 있습니다. /etc/passwd을 입력하면 모든 서버의 사용자 이름을 읽을 수 있습니다. 또는 허용 경로 (예 : "../../etc/passwd")를 사용하여 이름 앞에 파일을 추가하더라도 파일 이름에 '..'를 사용할 수 있습니다.

그런 일이 발생하면 파일 시스템의 예상되는 부분에 파일 이름이나 경로가 있고 사용자가 액세스 할 수 있도록하려는 파일에만 액세스하는 것과 같이 유효성을 위해 사용자가 지정한 값을 항상 확인해야합니다. PHP는 상대 경로 (또는 심볼릭 링크를 포함하는 경로)를 'real'으로 만드는 함수를 가지고 있습니다 : realpath().

'진짜'경로를 만든 후에 파일 시스템의 예상되는 부분에 경로가 있는지 확인한 다음 file_get_contents()에 안전하게 사용할 수 있습니다.

$wanted = $_GET['path']; 
$real = realpath('/var/www/user/accessible/' . $wanted); 
if (strpos($real, '/var/www/user/accessible/') === 0) { 
    echo file_get_contents($real); 
} else { 
    throw new Exception('not allowed to access this file'); 
} 
+0

괜찮 았어.하지만 나는 public_html에없는 파일을 읽거나 file_get_content를 추적 할 다른 방법이 있는지 알고 싶다. $ this는 E : \ wamp64 \ www \ website \이기 때문에이 메서드는 localhost에서 작동하지 않는다. public \ css \ fonts \ google_fonts.css이지만 www/website/(다른 /와 \) 여야합니다. 문제가 될 수 있습니까? – Alex

+0

파일에 ../ 이 항상 포함되어 있으면 공백으로 표시되므로 if (trim ($ real)! = '') { }과 같은 내용을 확인할 수 있습니까? – Alex