2010-02-17 4 views
17

나는 다음과 같은 코드가 있습니다매개 변수를 바인딩하는 경우 mysql_real_escape_string을 사용해야합니까?

function dbPublish($status) 
{ 
global $dbcon, $dbtable; 

if(isset($_GET['itemId'])) 
{ 
    $sqlQuery = 'UPDATE ' . $dbtable . ' SET active = ? WHERE id = ?'; 
    $stmt = $dbcon->prepare($sqlQuery); 
    $stmt->bind_param('ii', $status, $_GET['itemId']); 
    $stmt->execute(); 
    $stmt->close(); 
} 
} 

내가이 경우는 mysql_real_escape_string 또는 내가 좋아 생각해야합니까를? DB를 엔진 자체가 그렇게 할 것입니다 :

+1

SQL 주입에 영향을주지 않는 매개 변수 만 있습니다. '$ dbtable'과 같은 쿼리 문자열에 직접 보간 된 변수는 값이 사용자 입력에서 오는 경우 잠재적 인 벡터입니다. 물론 테이블 및 열 이름과 같은 항목은 사용자 입력에서 직접 가져 오지 않아야합니다. – outis

답변

27

아니, 당신은 자신 당신이 준비된 문을 사용하는 경우, (즉, 어떤 당신이 mysqli_real_escape_string를 호출 할 필요는 없다) 값을 이스케이프 할 필요가 없습니다.

(당신이 mysql_real_escape_string를 호출하고 바인딩 매개 변수를 사용한다면 사실, 당신의 문자열은 두 번 탈출받을 것 - 위대한하지 않을 것이다 : 당신이 어디서나 문자를 이스케이프로 끝날 것 ...)


값을 정수 ('ii'으로 표시)으로 전달하므로 준비 문을 사용하지 않았더라도 mysql_real_escape_string으로 전화하지 않아도됩니다. 이름에서 알 수 있듯이이 함수가 사용됩니다 이스케이프 ... 문자열.

정수의 경우 일반적으로 intval을 사용하여 SQL 쿼리에 주입하는 데이터가 실제로 정수인지 확인합니다.

(그러나, 당신은 준비된 쿼리를 사용하는 등, 다시 한번, 당신이 자신을 탈출의 종류를 할 필요가 없습니다)

1

아니, 당신은하지 않아야합니다. 이 두 가지를 결합하면 데이터에 표시되는 이스케이프 문자가 으로 표시됩니다.

0
function dbPublish($status)  
{  
global $dbcon, $dbtable;  

if(isset($_GET['itemId']))  
{  
    $sqlQuery = 'UPDATE ' . $dbtable . ' SET active = ? WHERE id = ?';  
    $stmt = $dbcon->prepare($sqlQuery);  
    $stmt->bind_param('ii', $status, $_GET['itemId']);  
    $stmt->execute();  
    $stmt->close();  
}  
} 
관련 문제