bind_param() 仅对用户输入的值或全部是必需的?

bind_param() only necessary on user-inputted values or all?

我一直在阅读有关 SQL 注射的文章,但找不到这个问题的答案。

我明白如果我这样查询

prepare("SELECT id, foo, bar FROM table WHERE username = ?");

那么我应该使用 bind_param('s', $username) 来避免 SQL 注入的可能性。

但是如果我 运行 我的查询不是用户输入的而是自动生成的 ID 之类的东西怎么办?示例:

prepare("SELECT username, foo, bar from table where id = ?");

其中id是自生成的(自增值)。我是否也必须在这里使用 bind_param('i', $id) 还是我可以将查询准备为:

prepare("SELECT username, foo, bar from table where id = '$id'");

如果需要 bind_param();,为什么?

谢谢!

如果您不运行查询用户输入的值,请改用 query() 方法。不要使用 bindParams() 和 execute(),因为您没有使用 prepare()。

query(SELECT username, foo, bar from table where id = '$id'");

从技术上讲,如果您不准备并非来自用户输入的数据,您就不会面临风险。但是,出于以下几个原因,强烈建议您这样做:

  1. 如果您忘记在某处准备任何用户输入数据,则该用户可能会向数据行中注入您不希望用户输入的内容。
  2. 重复您正在执行的操作以确保服务器安全是一种很好的做法。如果您开始混合使用,您很可能会忘记在实际需要的地方准备数据。
  3. 准备您的数据不仅仅是为了防止 SQL 攻击者注入。如果您不小心在代码中创建错误,它还会防止一些数据库问题。例如:

在您的代码中的某处,您有一个日志系统,可以将错误日志添加到您的数据库中。字符串将是:

Error: User "xxx" with IP "x.x.x.x" used a wrong password.


该字符串由您的脚本生成。所以你不准备它。然而,此字符串中的引号会导致您的数据库出现错误,如果您准备好它本来可以避免的。