我一直在阅读 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'");
If bind_param();
需要,为什么?
Thanks!
从技术上讲,如果您不准备非来自用户输入的数据,则不会面临风险。但是,出于以下几个原因,强烈建议您这样做:
- 如果您忘记在某处准备任何用户输入数据,则该用户有可能会向数据行中注入一些您不希望成为用户输入的内容。
- 重复您正在执行的操作以确保服务器安全是一个很好的做法。如果您开始将其混淆,您很可能会忘记在实际需要的地方准备数据。
- 准备数据不仅仅是为了防止攻击者进行 SQL 注入。如果您不小心在代码中创建了错误,它还可以防止出现一些数据库问题。例如:
在代码中的某个位置,您有一个日志系统,它将错误日志添加到数据库中。该字符串将是:
错误:IP“x.x.x.x”的用户“xxx”使用了错误的密码。
该字符串由您的脚本生成。因此你不准备它。然而,该字符串中的引号将导致数据库出现错误,如果您无论如何都准备了该错误,则可以避免这种错误。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)