停止使用不推荐使用的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注入吗?非常感谢任何愿意回答这个问题的人:)
您的mysqli逻辑看起来不错,如果您没有看到它们,则PHP手册中有一些示例。
为什么不使用时选择ID?另外,当只需要在完整结果集中返回一行时,您实际上就不需要绑定结果,因为我认为在这种情况下会发生这种情况(ID是表中的唯一索引),请改用get_result。
使用mysqli prepare可以防止所有常见的注入攻击,但不能针对0天风格的东西(尚未安装到驱动程序中)。