다음 include 문에 보안 위험이 있습니까? 예라면보안 및 URL 데이터 포함
include "pages/".$_GET["page"].".php";
:
- 왜?
- 더 안전한 접근 방법은 무엇입니까?
다음 include 문에 보안 위험이 있습니까? 예라면보안 및 URL 데이터 포함
include "pages/".$_GET["page"].".php";
:
- 왜?
- 더 안전한 접근 방법은 무엇입니까?
예. 처음에는 과 같은 일종의 유효성 검사없이 GET 변수를 직접 사용하지 않아야합니다.
또한 포함 할 경로의 임의 지정을 허용해서는 안됩니다.
대신 동적으로 많이 필요하거나 직접 참조해야하는 토큰을 전달해야하는 경우 특정 경로 내의 포함 경로에 포함을 제한하고 (지정된 경로가 해당 디렉토리의 파일을 참조하는지 확인해야합니다.) (그리고 연관된 토큰이 참조하는 파일을보기 위해 연관 배열을 검색하는 것과 같은 일을한다).
$allowed_pages = array(
"page1" => "pages/page1.php",
"page2" => "pages/page2.php",
"foobar" => "pages/page7.php",
"stuff" => "pages/blarg.php"
);
$page = $_GET['page'];
if(array_key_exists($allowed_pages, $page)) {
include($allowed_pages[$page]);
}
(.이 경우, 지정된 키가 포함될 수 있습니다 무엇에 모두 검증 및 제한 등의 행위를 허용하고 있다는 사실)
:후자의 예는 다음과 같이 될 것이다
$_GET["page"]
은 예외적 인 경로가 될 수 있으므로 위험합니다. 예를 들어 ../../settings.php
다른 것일 수 있습니다.
$allowedPages = array('news', 'contact', ...);
if (in_array($_GET["page"], $allowedPages)) {
include "pages/".$_GET["page"].".php";
} else {
throw new Exception('Page is not valid !');
}
좋은 일이 또한 파일이 존재하는지 확인하는 것입니다 :
이 같은 수행해야합니다.
뿐만 아니라 화이트리스트를 가진 것은,이
$include = $_GET['page'];
if (! preg_match('/^[a-z-_]+$/i', $include)) {
throw new Exception('Access denied');
}
같은 뭔가를 할 수는 "[페이지"] 페이지 GET /".$_ "를 포함 PHP를".. ";
당신이 접두사를 하드 코딩 한 사실이 같은 공격을 방지 :
페이지 = HTTP % 3A % 2F % 2Fwww.blackhat.com % 2Fbad.code % 3F
그러나 $ _GET [ 'page']에 '..'이 포함될 수 있기 때문에 누군가가 의 파일을 귀하의 시스템에서 PHP 확장자로 강제로 포함시킬 수 있습니다. 이 방법으로 보안 침해가 발생하지 않는다고 확신하십니까?
다른 사용자가 제안한 것처럼 허용 목록을 사용하는 것이 훨씬 안전하며 원격 포함 취약점을 피하기 위해 접두사를 앞에 붙이지 않아도됩니다.
c
http://ha.ckers.org/blog/20100128/micro-php-lfi-backdoor/ 이러한 종류의 것들을 악용하는 방법에 대한 더 많은 예제가 있습니다. 주석에는 많은 것들이 있습니다. – Arkh