【问题标题】:Do I have to use mysql_real_escape_string if I bind parameters?如果我绑定参数,我是否必须使用 mysql_real_escape_string?
【发布时间】:2015-11-17 00:57:25
【问题描述】:

我有以下代码:

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 还是可以?

【问题讨论】:

  • 注意只有参数对SQL注入免疫;任何直接插入到查询字符串中的变量(例如$dbtable)都是潜在向量,如果其值来自用户输入。当然,表名和列名之类的内容绝不应该直接来自用户输入。

标签: php sql mysql sql-injection mysql-real-escape-string


【解决方案1】:
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();    
 }    
}   

【讨论】:

    【解决方案2】:

    不,你不能。将两者结合会导致 在您的数据中显示的可见转义字符中。

    【讨论】:

      【解决方案3】:

      不,您不必自己转义值(即不,您不需要调用mysqli_real_escape_string,当您使用准备好的语句时:数据库引擎会自己做.

      (实际上,如果你调用 mysql_real_escape_string 并使用绑定参数,你的字符串会被转义两次——这不是很好:你最终会到处都是转义字符......) em>


      作为旁注:您的值作为整数传递(如'ii' 所示),因此即使您没有使用准备好的语句,您也不必调用mysql_real_escape_string:因为它name 表示,此函数用于转义...字符串。

      对于整数,我通常只使用intval 来确保我注入到我的 SQL 查询中的数据确实是整数。

      (但是,当您使用准备好的查询时,再一次,您不必自己进行这种转义)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-29
        • 1970-01-01
        • 2021-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多