我读了很多文章,说使用准备好的语句非常安全并且可以防止SQL注入。我没有使用准备好的语句就建立了一些网站。但是在阅读了所有这些文章之后,我正在考虑使用准备好的语句来更改整个代码。
我的问题
是否总是需要使用准备好的语句?还是存在正常陈述足以胜过准备陈述的情形?
答案 0 :(得分:4)
如果您具有完全硬编码的SQL查询并且在SQL中不需要PHP变量,则无需准备的语句就足够了。
这是一个例子:
$result = $mysqli->query("SELECT * FROM mytable WHERE updated_at > NOW() - INTERVAL 7 DAY");
查询是独立的。它只是一个固定的字符串,完全在您的应用程序的控制之下。任何不受信任的内容都不会影响查询。
如果您的查询需要一些可变部分,请使用查询参数,如下所示:
$stmt = $mysqli->prepare("SELECT * FROM mytable WHERE updated_at > NOW() - INTERVAL ? DAY");
$stmt->bind_param("i", $number_of_days);
$stmt->execute();
查询参数的重点是从SQL解析步骤中分离出可能不受信任的内容。通过使用参数,直到解析完SQL之后,绑定变量的值才与查询结合。因此,绑定参数不可能影响查询的逻辑-该参数将被限制为在查询中充当单个标量值。
答案 1 :(得分:1)
刚发现您的问题,我就想起了我过去的美好时光。我也发现很难执行准备好的语句,因为乍一看,没有它就容易编写代码。然后在另一个时候,我为使用PHP制作的登录系统感到骄傲。尽管完全从零开始,但感觉很棒。但是,我犯了一个错误,就是不使用它们,然后我检查了google如何绕过登录系统。第一个窍门让我头疼,因为我现在不知道用户名或密码就可以登录自己的网页,而只使用'-'
之类的字符,然后我就进入了网页。所以我一路走来,并通过参数化查询保护了它,现在它很安全。既然您和我都是初学者,那么这些事情肯定会让我们头痛。另外,仅当您接受用户输入的内容时才需要使用它们。否则你很好。只是四处寻找其他漏洞,例如XSS等。这些也是危险的。祝你好运