我经常在想 - 在清理HTML输入时,为什么要使用白名单而不是黑名单?
有多少狡猾的HTML技巧可以打开XSS漏洞?显然,脚本标签和框架是不允许的,并且在HTML元素中的字段上将使用白名单,但为什么要禁止大部分内容呢?
如果您在白名单中漏掉了某些内容,那么您只是破坏了某些一开始并不重要的东西。
如果您在黑名单中漏掉了某些内容,那么您就会打开一个严重的安全漏洞。
如果浏览器添加了新功能,那么您的黑名单就变得过时了。
<test onmouseover=alert(/XSS/)>mouse over this</test>
而且许多浏览器都可以正常工作。
因为这样,您就可以确保您不会错过任何内容。通过明确允许某些标签,您显然可以更好地控制允许的内容。
白名单在大多数安全相关主题中都被使用。想想防火墙。第一条规则是阻止任何(传入的)流量,然后只打开应该打开的端口。这使得它更加安全。
因为其他标签可能会破坏页面的布局。想象一下如果有人注入了<style>
标签会发生什么。<object>
标签也很危险。
</div>
也可以实现这个。 - Carson Myers<object>
标签的存在。 - Carson Myers你允许的越多,聪明的黑客就有更多的技巧来注入一些恶意代码到你的网页中。这就是为什么你想尽可能地减少允许的内容。
请参考Ruben van Vreeland的演讲How We Hacked LinkedIn & What Happened Next,了解跨站脚本攻击漏洞以及为什么你希望你的白名单尽可能严格!
我更喜欢同时使用“黑名单与宽松白名单”方法:
这个黑名单作为宽松白名单中标签/属性的开关。
这种“黑名单与宽松白名单”的方法使得配置过滤器变得更加容易。
例如,白名单可以包含所有html5标签和属性。而黑名单可以包含要排除的标签和属性。