我们怎么知道PDO正在逃避SQL注入?

时间:2011-01-07 16:23:09

标签: php mysql pdo sql-injection prepared-statement

我是PDO库的新手。我正在使用mysql作为我的数据库开发环境。使用“?”时,我可以使用prepare和execute函数运行查询使用命名占位符时的占位符和bindParam方法(例如:“:column”)。

在此之后,我尝试通过输入任何引号来清除查询,如mysql_real_escape_string,来查看PDO是否进行了任何类型的转义。我试图看看查询的外观,但我得到的只是传递给prepare语句的语句,而不是将要执行的查询。

我尝试了var_dump $ result-> execute()和$ result-> fetch()但是execute语句给了我带有占位符的prepare语句的sql,而fetch语句给了我该查询的结果。

有没有办法查看将要运行的查询查询,或者至少在运行查询之前参数的外观?

我希望我对自己的问题很清楚。 :|

4 个答案:

答案 0 :(得分:6)

当你写下这样的东西时:

$stmt = $pdo->prepare('SELECT * FROM tbl_name WHERE col_name = :col_name;');
$stmt->bindValue('col_name', 'some \' value');
$stmt->execute();

实际查询是...... SELECT * FROM tbl_name WHERE col_name = :col_name;。那叫做预备声明。首先,您将查询发送到数据库,稍后您将发送查询参数。 PDO不合并查询和参数。

您可能认为PDOStatement::bindValue()的确如此:

public function bindValue($placeholer, $value, $valueType = PDO::PARAM_STR) {
    $this->query = str_replace($placeholder, $this->quote($value, $valueType), $this->query);
}

它更像是这样:

public function execute() {
    try {
        $this->sendQueryToDatabase($this->query);

        // Query is valid
        $this->sendParametersToDatabase($this->parameters);

        return $this->fetchResultSet();
    } catch (... $e) {
        // Query is invalid (eg. syntax error)
        throw ...;
    }
}

Read more about Prepared Statements

答案 1 :(得分:3)

直截了当。

PDO有两种运行预准备语句的模式:

  1. 原生模式。查询和数据被发送到数据库 se-pa-ra-te-ly 。这意味着数据从不被添加到查询中。所以,不会有任何伤害。永远。查询按原样发送到数据库,带有?标记(但没有命名的占位符由PDO替换为? s)
  2. 兼容模式。 PDO确实通过用带有绑定变量的占位符替换变量名来进行旧式查询。字符串被引用/转义,其余的被转换为它的类型。
  3. 这两种方法都非常安全。

    当你有一个变量标识符 ...

    时,真正的危险就开始了

答案 2 :(得分:1)

prepare语句由mysql处理,所以pdo不会转义请求, pdo发送请求并在“之后”参数

答案 3 :(得分:-1)

启用常规查询日志,并在运行简单语句时观察实际对服务器执行的查询 - 执行一些插入操作,例如,使用包含嵌入式引号或nuls的字符串。