我一直在阅读SQL注入,但是找不到这个问题的答案。
我了解我是否需要这样的查询
prepare("SELECT id, foo, bar FROM table WHERE username = ?");
然后,我应该使用bind_param('s', $username)以避免SQL注入的可能性。
bind_param('s', $username)
但是,如果我对不是用户输入的东西(例如自动生成的ID)运行查询,该怎么办?例子:
prepare("SELECT username, foo, bar from table where id = ?");
id是自生成的(自动增加的值)。我是否也必须利用bind_param('i', $id)这里,还是可以将查询准备为:
bind_param('i', $id)
prepare("SELECT username, foo, bar from table where id = '$id'");
如果bind_param();需要,为什么?
bind_param();
谢谢!
从技术上讲,如果您不准备并非来自用户输入的数据,则不会面临任何风险。但是,强烈建议您这样做,原因有两个:
在代码中的某个位置,您有一个日志系统,该日志系统将错误日志添加到数据库中。该字符串将是:
错误:IP为“ xxxx”的用户“ xxx”使用了错误的密码。
该字符串由您的脚本生成。因此,您无需准备。但是,此字符串中的引号将导致数据库错误,如果您仍然准备数据库,则可以避免该错误。