如果我正在清理我的数据库插入,并且还转义我使用 htmlentities($text, ENT_COMPAT, 'UTF-8')
编写的 HTML — 是否还有必要使用 xss_clean 过滤输入?它还有什么其他好处?
原文由 Dan Searle 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果我正在清理我的数据库插入,并且还转义我使用 htmlentities($text, ENT_COMPAT, 'UTF-8')
编写的 HTML — 是否还有必要使用 xss_clean 过滤输入?它还有什么其他好处?
原文由 Dan Searle 发布,翻译遵循 CC BY-SA 4.0 许可协议
在您的情况下, “更严格的方法很好,而且重量更轻” 。 CodeIgniter 开发人员打算将 xss_clean() 用于不同的用例,“允许‘安全’HTML 标记的评论系统或论坛”。这在文档中并不清楚,其中 xss_clean 显示应用于用户名字段。
还有另一个永远不要使用 xss_clean() 的原因,到目前为止,StackOverflow 上还没有突出显示。 xss_clean() 在 2011 和 2012 期间被破坏,并且不可能完全修复。至少没有完全重新设计,这并没有发生。 目前,它仍然容易受到这样的字符串的攻击:
<a href="j&#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 许可协议
2 回答1.5k 阅读✓ 已解决
2 回答1.5k 阅读✓ 已解决
2 回答863 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决
1 回答1.1k 阅读✓ 已解决
2 回答862 阅读✓ 已解决
1 回答874 阅读✓ 已解决
xss_clean() 很广泛,也很愚蠢。这个函数的 90% 对防止 XSS 没有任何作用。例如寻找单词
alert
而不是document.cookie
。没有黑客会在他们的攻击中使用alert
,他们会用 XSS 劫持 cookie 或读取 CSRF 令牌来制作 XHR。但是运行
htmlentities()
或htmlspecialchars()
是多余的。以下是xss_clean()
修复问题和htmlentities($text, ENT_COMPAT, 'UTF-8')
失败的情况:一个简单的 poc 是:
这会将
onload=
事件处理程序添加到图像标签。停止这种形式的 XSS 的方法是htmlspecialchars($var,ENT_QUOTES);
或者在这种情况下xss_clean()
也将阻止这种情况。但是,引用 xss_clean() 文档:
也就是说,XSS 是
output problem
而不是input problem
。例如,此函数无法考虑变量已经在<script>
标记或事件处理程序中。它也不会阻止基于 DOM 的 XSS。您需要考虑 _如何使用数据_,以便使用最佳功能。过滤所有输入数据是一种 不好的做法。它不仅不安全,而且还会破坏数据,使比较变得困难。