我们应该始终在 MySQL 和 php 中使用准备好的语句还是什么时候使用它们?
Should we always use prepared statements in MySQL and php or when to use these?
看了很多文章说使用prepared statements是非常安全的,可以很好的防止SQL注入。我在没有使用准备好的语句的情况下建立了一些网站。但是在阅读了所有这些文章之后,我正在考虑使用准备好的语句来更改整个代码。
我的问题
是否必须始终使用准备好的语句?或者是否有任何情况下普通语句足以胜过准备好的语句?
如果您有一个完全硬编码的 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 被解析之前,绑定变量的值不会与查询结合。因此,绑定参数无法影响查询的逻辑——参数将被限制为查询中的单个标量值。
刚刚发现你的问题,我想起了我过去的美好时光。我也发现很难实现准备好的语句,因为乍一看,没有它编写代码感觉很容易。然后在另一次,我使用 PHP 制作了一个我引以为豪的登录系统。虽然完全从头开始,但感觉很棒。但是,我犯了一个错误,没有使用它们,然后我检查了 google 如何绕过登录系统。第一个技巧让我头疼,因为我现在可以在不知道用户名或密码的情况下登录我的网页,只需使用 '-'
之类的字符,然后我就进入了我的网页。所以我一路返回并使用参数化查询保护它,现在它是安全的。既然你我都是初学者,这些东西肯定会让我们很头疼。此外,仅当您接受用户输入的内容时才需要使用它们。否则你就可以走了。只需四处寻找其他漏洞,如 XSS 等。这些也很危险。祝你好运
看了很多文章说使用prepared statements是非常安全的,可以很好的防止SQL注入。我在没有使用准备好的语句的情况下建立了一些网站。但是在阅读了所有这些文章之后,我正在考虑使用准备好的语句来更改整个代码。
我的问题
是否必须始终使用准备好的语句?或者是否有任何情况下普通语句足以胜过准备好的语句?
如果您有一个完全硬编码的 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 被解析之前,绑定变量的值不会与查询结合。因此,绑定参数无法影响查询的逻辑——参数将被限制为查询中的单个标量值。
刚刚发现你的问题,我想起了我过去的美好时光。我也发现很难实现准备好的语句,因为乍一看,没有它编写代码感觉很容易。然后在另一次,我使用 PHP 制作了一个我引以为豪的登录系统。虽然完全从头开始,但感觉很棒。但是,我犯了一个错误,没有使用它们,然后我检查了 google 如何绕过登录系统。第一个技巧让我头疼,因为我现在可以在不知道用户名或密码的情况下登录我的网页,只需使用 '-'
之类的字符,然后我就进入了我的网页。所以我一路返回并使用参数化查询保护它,现在它是安全的。既然你我都是初学者,这些东西肯定会让我们很头疼。此外,仅当您接受用户输入的内容时才需要使用它们。否则你就可以走了。只需四处寻找其他漏洞,如 XSS 等。这些也很危险。祝你好运