2009-10-19 2 views
12

템플릿에 내용을 포함시키는 PHP가 포함 된 웹 사이트가 있습니다. 로드 할 페이지는 get 매개 변수에 지정되며 매개 변수의 끝에 ".php"를 추가하고 해당 페이지를 포함합니다. XSS 나 다른 것들 (데이터베이스가 없으므로 MySQL 삽입이 아닌)을 피하기 위해 보안 검사를해야합니다. 내가 생각해내는 것은 다음과 같다.

$page = $_GET['page']; 

if(!strpos(strtolower($page), 'http') || !strpos($page, '/') || 
    !strpos($page, '\\') || !strpos($page, '..')) { 
     //append ".php" to $page and include the page 

내 입력을 추가적으로 위생 처리 할 수있는 다른 방법이 있습니까?

+4

에 대한 내 대답은 참조 - 경기가 false –

+0

@ 톰로 평가됩니다 문자열의 시작 부분에있을 경우는 0을 반환 것이라고 acceppted 솔루션은 할 수 있습니다 어쨌든 고마워, 나는 미래 코드에 대한 조언을 기억할 것이다. –

+0

참고 : http://stackoverflow.com/a/15825812/59087 –

답변

27
$page = preg_replace('/[^-a-zA-Z0-9_]/', '', $_GET['page']); 

아마이를 소독하는 가장 빠른 방법입니다,이는 문자, 숫자, 밑줄 또는 대시를 포함 무엇을하고 있는지 확인합니다.

+1

여전히 16 진수 코드를 사용하여 공격 할 수 있습니다. http://stackoverflow.com/questions/134099/are-pdo-prepared-statements-sufficient-to- prevent-sql-injection/12202218 # 12202218 또한 http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php/12710285#12710285 –

+2

두 링크는 ​​모두 mysql에 관한 것이며 질문은 SQL 인젝션에 관한 것이 아니다 – NikkyD

3

소스 코드에 포함 된 명시 적 페이지 목록을 정의한 다음 입력을 확인하는 데 사용하십시오. 예, 더 많은 작업이지만 허락되는 것과 허락되지 않는 것이 매우 명확합니다. 예를 들면 다음과 같습니다.

$AVAILABLE_PAGES = array('home', 'news', ...); 
$AVAILABLE_PAGES = array_fill_keys($AVAILABLE_PAGES, 1); 

$page = $_GET['page']; 
if (!$AVAILABLE_PAGES[$page]) { 
    header("HTTP/1.0 404 Not Found"); 
    die('Page not found.'); 
} 

include "pages/$page.php"; 
7

공격은 소스가 아닌 데이터의 사용에만 적용됩니다. 대신 출력 할 때 값을 이스케이프 처리하십시오. 그런 식으로) (strpos의 결과를 확인하지 마십시오 What’s the best method for sanitizing user input with PHP?

+0

나는 그것을 읽었지만, 나는 그것이 작업하고있는 웹 사이트에 맞지 않는다고 생각한다. –