停止使用不推荐使用的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天风格的东西(尚未安装到驱动程序中)。
问题内容: 准备好的语句如何帮助我们防止SQL注入攻击? 维基百科说: 准备好的语句可以抵御SQL注入,因为稍后需要使用其他协议传输的参数值不需要正确地转义。如果原始语句模板不是从外部输入派生的,则不会发生SQL注入。 我不太清楚原因。用简单的英语和一些例子,简单的解释是什么? 问题答案: 这个想法很简单-查询和数据被发送到数据库服务器 分开 。 就这样。 SQL注入问题的根源在于 代码和数据 的
问题内容: 假设我有这样的代码: PDO文档说: 准备好的语句的参数不需要用引号引起来。司机为您处理。 那真的是我避免SQL注入所需要做的一切吗? 真的那么容易吗? 您可以假设MySQL会有所作为。另外,我真的只是对针对SQL注入使用准备好的语句感到好奇。在这种情况下,我不在乎XSS或其他可能的漏洞。 问题答案: 简短的回答是“ 否” ,PDO准备将不会为您防御所有可能的SQL注入攻击。对于某些晦
假设上面的代码是我的查询。什么是一个安全的替代方案,将允许自动增加在mySQL数据库。
问题内容: 我如何使用mysqli用LIKE进行查询并获得所有结果? 这是我的代码,但是不起作用: 此代码似乎不起作用。我已经搜索了很多。也可能返回多于1行。那么,即使返回的结果超过1行,我如何获得所有结果呢? 问题答案: 这是您正确获取结果的方式 或者,您也可以执行以下操作: 希望您意识到我从这里和这里的手册中直接得到了答案,这是您应该首先去的地方。
问题内容: 我完全被mySQLi弄糊涂了。尽管多年来我一直在使用过程性mysql调用,但我希望习惯于为其提供的db security / mySQL注入保护编写准备好的语句。我正在尝试编写一个简单的select语句(是的,我知道为此进行程序调用可提高性能)。运行时,我会得到所有回声,直到击中组件为止。在我看来,这一切都相当简单,但是在阅读了数小时的mySQLi手册后,我感到茫然。任何想法为什么会失