2010-02-17 120 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还是我好吗?

+1

请注意,只有参数不受SQL注入影响;任何直接插入查询字符串的变量(如'$ dbtable')都是一个潜在向量,如果它的值来自用户输入。当然,诸如表名和列名之类的东西绝不应直接来自用户输入。 – outis 2010-02-17 21:03:13

回答

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();  
}  
} 
相关问题