0

可能重复:
在 MySQLi 上使用 bind_param() 时,是否需要转义数据以防止 SQL 注入?

我有一个简化查询的类。这是一个如何插入数据的代码示例:

$dbi->prepare("INSERT INTO `temp` (`name`,`content`) VALUES (?,?);")->execute($name,$content);

类中有这样的函数:

public function execute(){
        if(is_object($this->connection) && is_object($this->stmt)){
            if(count($args = func_get_args()) > 0){
                $types = array();
                $params = array();

                foreach($args as $arg){
                    $types[] = is_int($arg) ? 'i' : (is_float($arg) ? 'd' : 's');
                    $params[] = $arg;
                                              /*
                                                 or maybe $params[] = $this->connection->real_escape_string($arg);
                                              */
                }

                array_unshift($params, implode($types));

                call_user_func_array(
                    array($this->stmt, 'bind_param'),
                    $this->_pass_by_reference($params)
                );
            }

            if($this->stmt->execute()){
                $this->affected_rows = $this->stmt->affected_rows;
                return $this;
            }
            else {
                throw new Exception;
            }
        }
        else {
            throw new Exception;
        }
    }

当我声明$params[]我有这样的$params[] = $arg;我应该放$params[] = $this->connection->real_escape_string($arg);还是不放?

谢谢。

4

2 回答 2

3

不,当您使用参数时,您不需要转义字符串。

事实上,您不能对字符串进行转义,因为您最终会将字符串存储在包含文字反斜杠的数据库中。这不是你想要的。

于 2012-11-18T15:50:19.883 回答
2

根据PHP Manual onmysqli和prepared statements:

转义和 SQL 注入

绑定变量将被服务器自动转义。服务器在执行之前将它们的转义值插入到语句模板的适当位置。必须向服务器提供绑定变量类型的提示,以创建适当的转换。有关详细信息,请参阅 mysqli_stmt_bind_param() 函数。

服务器内的值的自动转义有时被认为是防止 SQL 注入的安全功能。如果输入值正确转义,则可以使用非准备语句实现相同程度的安全性。

所以不,您不必关心转义,服务器会为您处理转义。

手动转义将导致双重转义值。而在我个人看来?,sql语句中占位符的最大好处就是不用担心转义。

于 2012-11-18T15:59:16.463 回答