为什么在HTML清洗中使用白名单?

8

我经常在想 - 在清理HTML输入时,为什么要使用白名单而不是黑名单?

有多少狡猾的HTML技巧可以打开XSS漏洞?显然,脚本标签和框架是不允许的,并且在HTML元素中的字段上将使用白名单,但为什么要禁止大部分内容呢?

7个回答

24

如果您在白名单中漏掉了某些内容,那么您只是破坏了某些一开始并不重要的东西。

如果您在黑名单中漏掉了某些内容,那么您就会打开一个严重的安全漏洞。

如果浏览器添加了新功能,那么您的黑名单就变得过时了。


啊——“减少人为错误的空间”这个方面我也想到了(当然我使用白名单),我只是好奇这个安全部分有多基本。 - Carson Myers
5
@Carson:关键部分是“如果浏览器添加新功能”。你无法预测这一点,没有任何办法。有人可能会认为,迎合人为错误是安全性的基本思想,因此要“将某些内容从白名单中删除”。 - sleske
3
即使您掌握了新浏览器功能,也可能会遇到未记录的功能问题(例如参考Ikke的答案),这可能会给您带来麻烦。 - sleske

5
我昨天刚读到了关于这个的一些内容。它在feedparser的手册中。
其中一段摘录如下:
随着我的调查越来越深入,我发现Internet Explorer for Windows会将看似无害的标记视为代码并轻易地执行它们。这就是Universal Feed Parser使用白名单而不是黑名单的原因。我相当有信心白名单上没有任何元素或属性构成安全风险。但对于我没有明确调查过的元素或属性,我完全没有信心。而且我也无法确定Internet Explorer for Windows会将哪些字符串作为可执行代码处理。我不会尝试保留“仅好的样式”。所有样式都将被剥离。
如果您只列出一些黑名单,并忘记了一个重要的元素,则存在严重的风险。当您列出一些您知道是安全的标签时,让某些可以被滥用的东西进入的风险就较小了。

一个好的观点,虽然我脑海中想不出任何可能会引起安全风险的东西,因为我已经知道了。你能提供一些关于看似无害但某种程度上可被利用的HTML元素的资源吗? - Carson Myers
2
@Carson - 是的,但如果明天出现了新的漏洞呢?如果您有一个严格的白名单 - 不需要更新。如果您有30个应用程序的黑名单 - 需要进行大量更新。 - Damien_The_Unbeliever

5
即使脚本标签和框架标签不被允许,你仍然可以像这样放置任何标签。
<test onmouseover=alert(/XSS/)>mouse over this</test>

而且许多浏览器都可以正常工作。


这是一个很好的例子,但当然使用白名单或黑名单时,像“onmouseover”之类的元素字段将从标签中剥离。 - Carson Myers
没错,我只是想提一下标签,onmouseover只是我现在想到的一个。 - YOU

3

因为这样,您就可以确保您不会错过任何内容。通过明确允许某些标签,您显然可以更好地控制允许的内容。

白名单在大多数安全相关主题中都被使用。想想防火墙。第一条规则是阻止任何(传入的)流量,然后只打开应该打开的端口。这使得它更加安全。


2

因为其他标签可能会破坏页面的布局。想象一下如果有人注入了<style>标签会发生什么。<object>标签也很危险。


没错,我想</div>也可以实现这个。 - Carson Myers
这并没有真正回答问题,黑名单也可以阻止这些标签。 - Andy E
@Andy,这可能是一个选择,但我认为这也说明了有太多需要考虑的事情,所以很容易将某些东西视为安全。显然,样式标签将被禁止,但说实话,我甚至可能忘记了<object>标签的存在。 - Carson Myers

0

你允许的越多,聪明的黑客就有更多的技巧来注入一些恶意代码到你的网页中。这就是为什么你想尽可能地减少允许的内容。

请参考Ruben van Vreeland的演讲How We Hacked LinkedIn & What Happened Next,了解跨站脚本攻击漏洞以及为什么你希望你的白名单尽可能严格!


0

我更喜欢同时使用“黑名单与宽松白名单”方法:

  1. 创建一个宽松的标签和属性“白名单”。
  2. 为“白名单”创建一个“黑名单”,任何在黑名单中的标签/属性都应该存在于你创建的白名单中,否则会出现错误。

这个黑名单作为宽松白名单中标签/属性的开关。

这种“黑名单与宽松白名单”的方法使得配置过滤器变得更加容易。

例如,白名单可以包含所有html5标签和属性。而黑名单可以包含要排除的标签和属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接