2011-11-13 2 views
0

관리하는 사이트 중 하나에는 보도 자료 목록이 포함되어 있으며 각 보도 자료 제목은 세부 정보 페이지에 대한 링크 역할을합니다.세부 정보 페이지에서 SQL 삽입 방지

제목과 세부 사항은 mysql db에서 가져온 것입니다.

세부 정보 페이지에 대한 URL 링크는 내가 매개 변수에 SQL 주입 코드를 추가하는 사람을 방지 할 수있는 방법 ../pr.php?ID=457

입니까?

공개 사이트에는 사용자 입력 양식이 없습니다.

답변

-1

URL에서 ID를 가져옵니다 코드의 라인을 찾아,이 같은 것입니다 :

$ID = $_GET["ID"]; 

변경 그것에 스크립트의이 추가

$_GET["ID"] = (int) $_GET["ID"]; 

당신이 누군가가 버지니아에있는 SQL을 주입 할 수있는 방법이없는 int로 캐스팅 할 때 riable. url의 해당 변수가 $ _REQUEST가 아닌 $ _GET 변수를 통해 사용되는지 또는 $ _SERVER [ "QUERY_STRING"]을 수동으로 구문 분석하여 더 나쁜지 여부도 확인해야합니다.

URL이 스크립트에 전달 된 유일한 변수인지 확인하십시오. 더 많은 변수가있는 경우 ID를 모두 보호해야합니다.

정수 값만 허용하는 변수를 고정하는 것은 쉽습니다.이 변환을 수행하면됩니다. 변수가 임의의 문자열 일 수 있으면 더 어려워 질 것입니다. 그런 다음 사용하는 데이터베이스 및 드라이버의 유형에 따라 해당 문자열이나 유사 항목에 대해 mysql_real_escape_string()을 사용해야합니다.

당신은 SQL 주입에 만발한 보편적 인 솔루션을 필요로하는 경우, 자동 데이터가 주사를 방지하기 위해 바인딩과 함께 PDO 확장을 사용하는 방법을 설명 내 다른 최근의 대답 좀 걸릴 아래 링크 :

stackoverflow.com/questions/8105508/does-this-work-to-stop-sql-injections/8105598#8105598

+0

그냥 당신이'의 id''으로 기록이없는 희망하자 0 '이다. – PeeHaa

+0

그리고 '0'과의 차이점은 무엇입니까? 게다가 아무도 ID가 '0'인 레코드를 보관하지 않습니다. –

+0

문자열'test3'에 대한 int 형 변환은 'expected'대신'0'을 반환합니다. http://codepad.org/Nrb5Wufb – PeeHaa

4

수 없습니다. 서버에 네트워크 연결을 할 수있는 사람들은 원하는 모든 데이터를 보낼 수 있습니다.

대신 render the injection attempts harmless을 사용해야합니다 (예 : 404 Not Found 응답을 보내서 데이터에서 0 행을 다시 얻는 경우). 상단에,

$ID = (int) $_GET["ID"]; 

또는 더 나은 및 안전 :

1

예를 들어 ID 매개 변수가 0이 아닌 양의 정수가되어야한다고 가정합니다. @Czarek의 답변으로 충분합니다.

$id = (int) $_GET["ID"]; 

또는 일 내장 기능 intval()

:

$id = intval($_GET["ID"]); 

그러나 입력이 어떤 정수 값이없는 경우이 방법이 모두 0 반환 (예를 들어 "ABC")는, 당신은 조심해야한다 그래서 ID가 0을 지정하면 사용자가 액세스 할 의도가없는 내용이 표시됩니다. id 값은 1부터 시작하고 그럴 경우 안전합니다.

더 많은 유연성을 위해 PHP의 내장 filter 확장을 사용할 수도 있습니다.

if (filter_has_var(INPUT_GET, "ID") && 
    filter_input(INPUT_GET, "ID", FILTER_VALIDATE_INT, array("min_range"=>1)) 
{ 
    $id = filter_input(INPUT_GET, "ID", FILTER_SANITIZE_NUMBER_INT); 
    // then show data for $id 
} else { 
    // show default page 
} 

당신은 또한에 관심이있을 수 :

관련 문제