php-bind_param()仅对用户输入的值或全部必需?
作者:互联网
我一直在阅读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();是必需的,为什么呢?
谢谢!
解决方法:
从技术上讲,如果您不准备并非来自用户输入的数据,则不会面临风险.但是,强烈建议您这样做,原因有两个:
>如果您忘记了在某处准备任何用户输入数据,则该用户很有可能会向数据行中注入了您从未希望成为用户输入的其他内容.
>重复执行您的操作以确保服务器安全是一个好习惯.如果您开始对其进行混合,则很有可能会忘记在实际需要的地方准备数据.
>准备数据不仅是为了防止攻击者进行SQL注入.如果您不小心在代码中创建了错误,它还可以防止某些数据库问题.例如:
在代码中的某个地方,您有一个日志系统,该日志系统将错误日志添加到数据库中.该字符串将是:
Error: User “xxx” with IP “x.x.x.x” used a wrong password.
该字符串由您的脚本生成.因此,您无需准备.但是,此字符串中的引号将导致数据库错误,如果您仍然准备数据库,则可以避免该错误.
标签:php,sql,mysql,sql-injection,bindparam 来源: https://codeday.me/bug/20191012/1898835.html