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