【问题标题】:Mysqli prepared statement (SQL injection prevention)mysqliprepared statement(SQL注入预防)
【发布时间】:2012-12-21 09:40:27
【问题描述】:

在停止使用不推荐使用的 mysql_* 函数后,我切换到了 mysqli。但是后来,我注意到未准备好的语句对于 SQL 注入是不安全的。然后,我再次更改了我的代码。

我所拥有的是以下函数,它检查变量 $ID 是否存在于数据库中并打印该行的 title 值:

function showPostTitle($ID, $mysqli) {
    $result = $mysqli -> query("SELECT ID, title FROM blog where ID = $ID");
    $row = $result -> fetch_array(MYSQLI_BOTH);
    echo $row['title'];
}

我改成这样了:

function showPostTitle($ID, $mysqli) {
    $stmt = $mysqli -> prepare("SELECT ID, title FROM blog WHERE ID = ?");
    $stmt -> bind_param("i", $ID);
    $stmt -> execute();
    $stmt -> bind_result($ID, $title);
    $stmt -> fetch();
    print_r($title);
    $stmt -> free_result();
}

我的问题是:这是实现准备好的语句的正确方法吗?另外,我现在可以免受 SQL 注入的影响吗?非常感谢谁会回答这个问题:)

【问题讨论】:

    标签: php mysql sql code-injection


    【解决方案1】:

    您的 mysqli 逻辑似乎很好,PHP manual here 中有一些示例以防您没有看到它们。

    你为什么在不消费的时候选择ID呢?此外,当我假设在这种情况下会发生(ID 是表中的唯一索引)时,它只会在完整结果集中返回一行时,您实际上不需要绑定结果,请改用 get_result

    使用 mysqli prepare 将防止所有常见的注入攻击,但不能防止尚未进入驱动程序的 0-day 风格的东西。

    【讨论】:

    • 感谢您的建议。正如你所说,我也选择了 $ID 而不使用它 :) 我删除了它!
    • 使用 PDO 或 mysqli 真的只是一个见仁见智的问题,是否有任何计划从 mySQL 更改为其他东西?如果这个人正在远离 mysql_ 让他们使用对他们来说更容易的东西。
    • 我认为 PDO 和 mysqli 几乎都可以满足我的需求。我错了吗?
    • PDO 更具前瞻性,PDO 允许您轻松地将 mysql 数据库换成另一种类型。这是主要区别,但也有比 mysqli 更多的选项,并且没有有助于强制执行 oo 样式的程序替代方案。此外,mysqli 可能会在 PDO 不会被弃用的地方被弃用。
    【解决方案2】:

    看看这篇文章:

    Are PDO prepared statements sufficient to prevent SQL injection?

    它使用 PDO 而不是 MySQLi,它通过创建准备好的语句来解决同样的问题。

    很抱歉没有回答您的问题,只是想提供一个资源供您考虑。

    【讨论】:

    • 谢谢,我会读一读,同时,我希望有人可以检查我的代码并告诉我(除了 SQL 注入问题)它是否正确实现。
    猜你喜欢
    • 1970-01-01
    • 2012-05-22
    • 2017-12-17
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    相关资源
    最近更新 更多