小编典典

Mysqli准备的语句(防止SQL注入)

sql

停止使用不推荐使用的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注入吗?非常感谢任何愿意回答这个问题的人:)


阅读 163

收藏
2021-03-23

共1个答案

小编典典

您的mysqli逻辑看起来不错,如果您没有看到它们,则PHP手册中有一些示例。

为什么不使用时选择ID?另外,当只需要在完整结果集中返回一行时,您实际上就不需要绑定结果,因为我认为在这种情况下会发生这种情况(ID是表中的唯一索引),请改用get_result

使用mysqli prepare可以防止所有常见的注入攻击,但不能针对0天风格的东西(尚未安装到驱动程序中)。

2021-03-23