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 准备好的语句有多安全?的主要内容,如果未能解决你的问题,请参考以下文章