PDO 准备好的语句有多安全?

Posted

技术标签:

【中文标题】PDO 准备好的语句有多安全?【英文标题】:How safe are PDO prepared statement? 【发布时间】:2012-08-12 19:09:17 【问题描述】:

我想知道 PDO 准备好的语句是否可以让我免于 SQL 注入?

示例: $DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);

我要插入的数据

$data = array('name' => $userInput_1, 'addr' => $userInput_2, 'city' => $userinput_3);

例如 $userInput_2 是 SLQ INJECTION。

$STH = $DBH->("INSERT INTO peoples (name, addr, city) 值 (:name, :addr, :city)");

这种情况下执行后会发生什么?

$STH->执行($data);

谢谢!

【问题讨论】:

【参考方案1】:

所有输入都将被正确转义和引用。所以使用 PDO 准备/执行应该可以防止 SQL 注入。

来自 php 手册:

为以下语句调用 PDO::prepare() 和 PDOStatement::execute() 将使用不同的参数值多次发出 通过允许驱动程序优化应用程序的性能 协商查询计划的客户端和/或服务器端缓存和 元信息,并有助于通过以下方式防止 SQL 注入攻击 无需手动引用参数。

【讨论】:

谢谢。但是我会得到异常还是将值填充到 DB 中? 视情况而定,字符串会被转义,但空值会阻止查询被执行。 $STH -> execute($data) 的结果将为 FALSE $data = array( 'name' => null, 'addr' => "1' AND 1=1", 'city' => false ); $data = array( 'name' => 'null', 'addr' => "1' AND 1=1", 'city' => 'false' ); 第一个失败,第二个成功

以上是关于PDO 准备好的语句有多安全?的主要内容,如果未能解决你的问题,请参考以下文章

PDO 是不是仍在为 MySQL 模拟准备好的语句?

PDO 准备好的语句如何帮助防止 SQL 易受攻击的语句?

使用 PDO 准备好的语句 MySQL 错误

带有位域的 PDO 准备好的语句

为啥使用 mysql 准备好的语句比使用常见的转义函数更安全?

在 PHP 中到处使用准备好的语句? (PDO)