htmlentities()和mysql_real_escape_string()是否足以清除PHP中的用户输入?


Is htmlentities() and mysql_real_escape_string() enough for cleaning user input in PHP?

本问题已经有最佳答案,请猛点这里访问。

我是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和样式具有实际效果并且只显示为文本?

或者我是否需要在我的函数中添加更多内容才能使输入真正无害?


mysql_real_escape_string是不够的。您还必须考虑如何构建查询。请考虑以下简单的登录脚本:

1
2
3
$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(跨站点脚本)。如果要存储数据库中用户的输入并且数据在浏览器中呈现,则至少要删除标记。

根据您的语言,有许多过滤器和代码可供使用。如果您使用Rails或CodeIgniter,它就是为您完成的。

就这种类型的安全性而言,我建议使用以下内容:

  • 下载并安装该死的易受攻击的网络应用它的应用程序旨在教授网络黑客的来龙去脉(基于PHP)
  • 总是尝试提交不同字符集的字符
  • 总是尝试提交NULL字节
  • 避免在查询字符串中传递太多参数(它可以泄露您的数据结构)
  • 看你的日志
  • 下载burpsuite - 你再也不会以同样的方式看待网站了
  • 看着健谈。 mysql错误消息非常适合调试,但它们会泄露大量信息 - 通常它们会显示整个查询!
  • 底线 - 如果它来自用户,则无法信任!


    这两个函数确实解决了关于任何类型注入和更多问题的安全问题的主要部分,但是,您的应用程序可能具有的安全错误数量是惊人的。

    如果你是一个安全怪物,那么你就会遇到重大问题,但是你可以通过检查Chris Shiftlett的网站来做到这一点,该网站是全球PHP安全的主要权威之一。

    最后,您可以查看OWASP网站和他们的十大项目,在那里他们跟踪最常见的安全威胁,并保持对hw的更新以对抗它们,

    希望我能提供帮助。


    如果您使用的是PHP 5.2或更高版本,则可以使用内置输入清理。

    例如:

    $input = filter_input(INPUT_POST, 'comment', FILTER_SANITIZE_STRING);

    参考文献:

  • filter_input
  • 可用过滤器