我经常想知道——为什么在清理 HTML 输入时使用白名单而不是黑名单?
有多少偷偷摸摸的 HTML 技巧来打开 XSS 漏洞?显然脚本标签和框架是不允许的,并且在 HTML 元素中的字段上会使用白名单,但为什么不允许大部分内容呢?
如果您将某些内容从白名单中删除,那么您只是破坏了一些对您来说不够重要的事情。
如果您将某些内容从黑名单中删除,那么您已经打开了一个很大的安全漏洞。
如果浏览器添加了新功能,那么您的黑名单就会过时。
昨天刚读了一些关于那个的东西。它在feedparser的手册中。
一个片段:
我调查得越多,我发现 Internet Explorer for Windows 将看似无害的标记视为代码并愉快地执行它的情况就越多。这就是 Universal Feed Parser 使用白名单而不是黑名单的原因。我有理由相信白名单上的任何元素或属性都不是安全风险。我对我没有明确调查过的元素或属性一点信心都没有。而且我完全没有信心检测 Windows 版 Internet Explorer 将视为可执行代码的属性值中的字符串。我不会试图保留“只是好的风格”。所有样式都被剥离。
如果您只将某些元素列入黑名单,而忘记了重要的元素,则存在严重的风险。当您将一些您知道是安全的标签列入白名单时,让某些可能被滥用的东西的风险较小。
即使不允许使用脚本标签和框架标签,您仍然可以像这样放置任何标签
<test onmouseover=alert(/XSS/)>mouse over this</test>
许多浏览器都可以工作。
因为那样你就确定你不会错过任何东西。通过明确允许某些标签,您显然可以更好地控制允许的内容。
白名单用于大多数与安全相关的主题。想想防火墙。第一条规则是阻止任何(传入)流量,然后只打开应该打开的端口。这使它更加安全。
因为其他标签可能会破坏页面的布局。想象一下如果有人注入<style>
标签会发生什么。<object>
标签也很危险。
我更喜欢两者兼而有之,我称之为“黑名单和宽松的白名单”方法:
此黑名单充当宽松白名单中标签/属性的开关。
这种“带有宽松白名单的黑名单”方法使配置清理过滤器变得更加容易。
例如,白名单可以包含所有 html5 标签和属性。而黑名单可以包含要排除的标签和属性。
您允许的越多,聪明的黑客在您的网页中注入一些讨厌的代码的技巧就越多。这就是为什么您希望尽可能少地允许。
请参阅Ruben van Vreeland的讲座我们如何入侵 LinkedIn 以及接下来会发生什么,以很好地介绍 XSS 漏洞以及为什么您希望白名单尽可能严格!