为什么 OWASP 将 HTML 列入白名单而不是黑名单信任方法?

Why does OWASP whitelist HTML as opposed to a blacklist trust approach?

更新了错误术语

我在看JSoup and the OWASP Java HTML sanitizer project。我只对这样的工具感兴趣,目的是通过清理传递给 API 层的用户输入来防止 XSS 攻击。 OWASP 项目说

"Passing 95+% of AntiSamy's unit tests plus many more."

但是,它并没有告诉我自己在哪里可以看到这些测试。这些测试涵盖哪些内容?更简单地说,我想知道为什么这些所说的工具默认为白名单信任。

我敢肯定他们选择白名单还是黑名单是有原因的。我只想禁止已知的 XSS 不安全标记,如 script 和属性,如 on*。黑名单方法似乎根本不可能。

我需要知道这样做的原因是什么,我怀疑它在测试中。例如,为什么不允许 style 标签?它在 XSS 方面是危险的还是出于其他原因而存在? (style 可能是 XSS 不安全的,如评论中所述:XSS attacks and style attributes

我正在为其他标签寻找更多 XSS 不安全理由。如果有人知道在哪里可以找到它们,那么单元测试本身就足够了。给定足够多的不安全标签,这应该告诉我为什么需要白名单方法。

原始的反同性测试在AntiSamyTest (antisamy)

它们在 AntiSamyTest (owasp) 中适用于 owasp。

它们包含针对不同 html 片段的测试,例如:

assertSanitizedDoesNotContain("<TABLE BACKGROUND=\"javascript:alert('XSS')\">", "background");

assertSanitizedDoesNotContain("<META HTTP-EQUIV=\"refresh\" CONTENT=\"0;url=data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K\">", "<meta");

有关更多示例,请参阅 XSS Evasion Cheat Sheet

我们尝试了黑名单,但我们一直在寻找新的标签或属性来绕过黑名单,或者格式错误的 html 和旁路过滤器使用的其他编码,使黑名单变得不切实际且无效。所以现在默认的假设是,如果标签、属性或样式没有明确指定为安全的,那么它就是不安全的。这不仅可以防止我们已知的 xss 攻击,还可以防止许多新类型。