在PHP中,使用htmlentities()和mysql_real_escape_string()对用户输入进行清理是否足够?

15
我很新于PHP,基本上我正在尝试为我的网站创建一个评论系统。我有以下功能: $input = $_POST['comment'];
function cleanUserInput($input) { $input = mysql_real_escape_string($input); $input = htmlentities($input); return $input; }
所以问题是,mysql_real_escape_string单独足以防止SQL注入吗?htmlentities()单独足以防止用户输入的脚本、HTML和样式生效并仅显示为文本吗?
还是说我需要向我的函数添加更多内容来使输入真正无害?

使用htmlspecialchars()来转义HTML。 - Marc B
3个回答

16

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周围不加引号,则仍然可能发生注入。 (考虑用户名= test; DROP TABLE users; - 再见数据! :(

从消毒的角度来看,mysql_real_escape_string足够了,如果您正确构造查询,这将很好地工作。

一个更好的问题是“你想要防止什么?”您还应该了解存储和反射的XSS(跨站点脚本)存储。如果您正在将用户输入存储在数据库中并且该数据在浏览器中呈现,则至少要删除<script>标记。

根据您的语言,线上有许多过滤器和代码可用于此。如果您使用Rails或CodeIgniter,则已为您完成。

就此安全类型而言,我建议使用以下:

  1. 下载并安装damn vulnerable web app。 这是一个旨在教授Web黑客的细节的应用程序(基于php)
  2. 始终尝试提交不同字符集的字符
  3. 始终尝试提交NULL字节
  4. 避免在查询字符串中传递太多参数(它可以泄露您的数据结构)
  5. 监视您的日志
  6. 下载burpsuite - 您将再也不会以同样的方式查看网站
  7. 要谨慎。 mysql错误消息非常适合调试,但它们透露了大量信息 - 往往会显示整个查询!

最重要的是-如果它来自用户,则不能相信它!


谢谢你的负评,没有留下评论!:) - sethvargo

4

这两个函数确实解决了关于任何类型注入的主要安全问题和其他一些问题,但是您的应用程序可能存在的安全漏洞数量令人震惊。

如果您是一个安全狂人,那么您将面临重大问题,但是通过开始检查Chris Shiftlett's website,他是PHP安全方面世界上最重要的权威之一,您就可以得到帮助。

最后,您可以查看OWASP网站和他们的十大项目,在那里他们跟踪最常见的安全威胁并更新如何应对它们的方法。

希望我能提供帮助。


2
如果您正在使用PHP 5.2或更高版本,则可以使用内置的输入净化功能。
例如: $input = filter_input(INPUT_POST,'comment',FILTER_SANITIZE_STRING);
参考资料:
  1. filter_input
  2. Available filters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接