2

我一直在阅读有关 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();需要,为什么?

谢谢!

4

2 回答 2

1

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

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

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

错误:IP 为“xxxx”的用户“xxx”使用了错误的密码。


此字符串由您的脚本生成。所以你不用准备。然而,这个字符串中的引号会导致您的数据库出现错误,如果您无论如何准备它,这些错误可能会被阻止。

于 2015-07-05T13:13:42.363 回答
-2

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

query(SELECT username, foo, bar from table where id = '$id'");
于 2015-07-05T13:05:47.717 回答