小编典典

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

sql

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

谢谢!


阅读 171

收藏
2021-04-14

共1个答案

小编典典

从技术上讲,如果您不准备并非来自用户输入的数据,则不会面临任何风险。但是,强烈建议您这样做,原因有两个:

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

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

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

该字符串由您的脚本生成。因此,您无需准备。但是,此字符串中的引号将导致数据库错误,如果您仍然准备数据库,则可以避免该错误。

2021-04-14