我一直在阅读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();
,为什么?
谢谢!
答案 0 :(得分:1)
从技术上讲,如果您不准备不是来自用户输入的数据,那么您就没有风险。但是,强烈建议这样做有几个原因:
在代码中的某处,您有一个日志系统,可以将错误日志添加到您的数据库中。字符串将是:
错误:IP“x.x.x.x”的用户“xxx”使用了错误的密码。
该字符串由您的脚本生成。因此你不准备它。然而,此字符串中的引号将导致您的数据库出现错误,如果您已准备好它,则可能会被阻止。
答案 1 :(得分:-2)
如果您没有对用户输入的值运行查询,请改用query()方法。不要使用bindParams()和execute(),因为你没有使用prepare()。
query(SELECT username, foo, bar from table where id = '$id'");