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

时间:2015-07-05 12:50:55

标签: php mysql sql sql-injection bindparam

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

谢谢!

2 个答案:

答案 0 :(得分:1)

从技术上讲,如果您不准备不是来自用户输入的数据,那么您就没有风险。但是,强烈建议这样做有几个原因:

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

      

    错误:IP“x.x.x.x”的用户“xxx”使用了错误的密码。


    该字符串由您的脚本生成。因此你不准备它。然而,此字符串中的引号将导致您的数据库出现错误,如果您已准备好它,则可能会被阻止。

答案 1 :(得分:-2)

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

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