CodeIgniter - 为什么使用 xss_clean

新手上路,请多包涵

如果我正在清理我的数据库插入,并且还转义我使用 htmlentities($text, ENT_COMPAT, 'UTF-8') 编写的 HTML — 是否还有必要使用 xss_clean 过滤输入?它还有什么其他好处?

原文由 Dan Searle 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 592
2 个回答

xss_clean() 很广泛,也很愚蠢。这个函数的 90% 对防止 XSS 没有任何作用。例如寻找单词 alert 而不是 document.cookie 。没有黑客会在他们的攻击中使用 alert ,他们会用 XSS 劫持 cookie 或读取 CSRF 令牌来制作 XHR。

但是运行 htmlentities()htmlspecialchars() 是多余的。以下是 xss_clean() 修复问题和 htmlentities($text, ENT_COMPAT, 'UTF-8') 失败的情况:

 <?php
print "<img src='$var'>";
?>

一个简单的 poc 是:

http://localhost/xss.php?var=http://domain/some_image.gif’%20onload=alert(/xss/)

这会将 onload= 事件处理程序添加到图像标签。停止这种形式的 XSS 的方法是 htmlspecialchars($var,ENT_QUOTES); 或者在这种情况下 xss_clean() 也将阻止这种情况。

但是,引用 xss_clean() 文档:

当然,没有什么是 100% 万无一失的,但我无法让任何东西通过过滤器。

也就是说,XSS 是 output problem 而不是 input problem 。例如,此函数无法考虑变量已经在 <script> 标记或事件处理程序中。它也不会阻止基于 DOM 的 XSS。您需要考虑 _如何使用数据_,以便使用最佳功能。过滤所有输入数据是一种 不好的做法。它不仅不安全,而且还会破坏数据,使比较变得困难。

原文由 rook 发布,翻译遵循 CC BY-SA 4.0 许可协议

在您的情况下, “更严格的方法很好,而且重量更轻” 。 CodeIgniter 开发人员打算将 xss_clean() 用于不同的用例,“允许‘安全’HTML 标记的评论系统或论坛”。这在文档中并不清楚,其中 xss_clean 显示应用于用户名字段。

还有另一个永远不要使用 xss_clean() 的原因,到目前为止,StackOverflow 上还没有突出显示。 xss_clean() 在 20112012 期间被破坏,并且不可能完全修复。至少没有完全重新设计,这并没有发生。 目前,它仍然容易受到这样的字符串的攻击:

 <a href="j&#x26;#x41;vascript:alert%252831337%2529">Hello</a>

xss_clean() 的当前实现首先有效地将 urldecode() 和 html_entity_decode() 应用于整个字符串。这是必需的,因此它可以对诸如“javascript:”之类的内容进行简单的检查。最后, _它返回解码后的字符串_。

攻击者可以简单地对其漏洞进行两次编码。它将被 xss_clean() 解码一次,并作为干净的传递。然后你有一个单独编码的漏洞利用,准备在浏览器中执行。

我称这些检查为“幼稚”且无法修复的,因为它们在很大程度上依赖于正则表达式。 HTML 不是一种常规语言。 您需要一个更强大的解析器来匹配浏览器中的解析器; xss_clean() 没有类似的东西。也许可以将 HTML 的一个子集列入白名单,它可以用正则表达式进行干净的词法分析。但是,当前的 xss_clean() 非常像是一个黑名单。

原文由 sourcejedi 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题