3

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

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

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 注入的影响吗?非常感谢谁会回答这个问题:)

4

2 回答 2

4

你的 mysqli 逻辑看起来不错,这里的PHP 手册中有一些示例,以防你没有看到它们。

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

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

于 2013-01-07T16:45:35.400 回答
1

看看这个帖子:

PDO 准备好的语句是否足以防止 SQL 注入?

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

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

于 2013-01-07T16:16:43.830 回答