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

mac*_*cha 5 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语句给了我该查询的结果.

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

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

Cro*_*zin 6

当你写下这样的东西:

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

实际的查询是... 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);
}
Run Code Online (Sandbox Code Playgroud)

但事实并非如此.

它做了更像这样的事情:

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 ...;
    }
}
Run Code Online (Sandbox Code Playgroud)

阅读有关准备语句的更多信息

  • 参数不能是不安全的,因为它们不是查询的一部分.它们只是一个原始数据. (2认同)