2012-05-11 4 views
-2

가능한 중복 : 그러니까 기본적으로
Are mysql_real_escape_string() and mysql_escape_string() sufficient for app security?이 PHP 코드가 악용 될 수 있습니까?

나는 URL

예에 qryName 있습니다 mysite.com/qryName=WHAT

if (isset($_GET['qryName'])) 
{ 
    $qryName = mysql_real_escape_string(filter($_GET['qryName'])); 
} 

$urldata = mysql_fetch_assoc(mysql_query("SELECT * FROM gangs WHERE ShortName = '" . $qryName . "' LIMIT 1")); 

$ urldata는 코드이므로 datab에서 거의 선택합니다. ase. 데이터베이스에서 qryName에는 공백이나 특수 문자 등이 없습니다.

악용 될 수 있는지 궁금합니다.

+0

http://codereview.stackexchange.com/를 확인하지 않습니다 – CodeCaster

+2

PDO를 배우십시오. mysql_ * 함수는 보안상의 이유로 공식적으로 사용되지 않습니다. – itachi

+0

@itachi이 시나리오에서'mysql_real_escape_string()'이 안전하지 않다는 것을 보여주십시오. –

답변

1

제대로 값 탈출 이후 안전 -하지 않는 한을 ....

... 당신이 변수 register_globals를 사용하도록 설정 초기화하지 않습니다. 이 경우 누군가가 쿠키 또는 POST 값을 사용하여 악의적 인 SQL 문이 포함 된 $qryName에 대해 임의의 값을 보낼 수 있습니다.

을 게시했을 때 if 문 앞에 변수를 초기화하면 코드가 안전하므로 코드가 안전합니다. 이스케이프 처리 대신 준비된 명령문 (PDO 포함)을 사용하는 것을 고려해보십시오 - 코드가 읽기 쉽도록 만듭니다.

1

PDO과 같은 것을 사용하셨습니까? 내 이해는 PDO와 바운드 변수를 사용할 때 SQL 주입이 불가능하다는 것입니다. 또한 고려할 가치가있는 다른 이점이 있습니다.

유사한 PDO 쿼리는 다음과 같습니다

$data=array($_GET['qryName']); 
    try { 
     $STH = $this->DBH->prepare('SELECT * FROM gangs WHERE ShortName = ? LIMIT 1'); 
     $STH->execute($data); 
     while($row = $STH->fetch()) { 
       $var1=$row->FieldName; 
     } 
    } 
    catch(PDOException $e) {echo $e->getMessage();} 

당신은 SQL 문에서 각 물음표를 위해 ($ 데이터) 배열에 변수를 추가하고이 바인딩됩니다.

+0

+1은 PDO를 권장합니다. – itachi

1

왜 검증 한 여분의 조각을 추가하거나는 isset을 꺼내 그것은 단지 예를 들어 문자가 포함 된 경우

if(ctype_alpha($_GET['qryName'])) { 

    $qryName = mysql_real_escape_string(filter($_GET['qryName'])); 

} 

http://php.net/manual/en/function.ctype-alpha.php

관련 문제