【问题标题】:How safe are PDO prepared statement?PDO 准备好的语句有多安全?
【发布时间】: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);

谢谢!

【问题讨论】:

    标签: pdo sql-injection


    【解决方案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' ); 第一个失败,第二个成功
    猜你喜欢
    • 2010-11-21
    • 1970-01-01
    • 2015-12-08
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    相关资源
    最近更新 更多