mysql_real_escape_string是不够的。您还必须考虑如何构建您的查询。考虑下面这个简单的登录脚本:
$username = mysql_real_escape_string($_GET['username']);
$password = mysql_real_escape_string($_GET['password']);
$sql = "SELECT * FROM users WHERE username = $username AND password = $password";
没有引号$username
和$password
,注入仍然是可能的。 (考虑一个用户名=测试; DROP TABLE用户; - 再见数据:(
mysql_real_escape_string是从消毒点足够如果你正确地组织你的查询正确构造的查询,这工作正常
!。
一个更好的问题是“你想要防止什么?”你还应该知道存储和反映的XSS(跨站点脚本)。如果你将用户的输入存储在数据库中,并且数据在浏览器,您至少需要去掉<script>
标签
根据您的语言,有很多过滤器和代码可供在线使用如果您使用Rails或Cod eIgniter,它是为你完成的。
至于这种类型的安全性而言,我建议使用下列内容:
- 下载和安装damn vulnerable web app。它的一个应用程序,旨在传授黑客攻击的插件和网页的情况(基于PHP)
- 总是试图提出不同的字符集的字符
- 总是尝试提交空字节
- 避免传入参数太多查询字符串(它可以放弃你的数据结构)
- 看你的日志
- 下载burpsuite - 你永远不会看到一个网站,以同样的方式再次
- 手表而健谈。 mysql错误信息非常适合调试,但是它们会泄露大量信息 - 通常会显示整个查询!
底线 - 如果来自用户,那么不能被信任!
对于逸出HTML中,使用用htmlspecialchars()代替。 – 2011-01-08 06:22:20