内容安全策略在Internet Explorer 11中无法正常工作

8
在我的asp.net core应用程序中,针对每个响应我都会添加内容安全策略头信息。我了解到对于IE浏览器,头信息名称为X-Content-Security-Policy,而对于其他浏览器如chrome,其名称为Content-Security-Policy。 头信息的值看起来像下面这样,其中nonce对于每个响应都是不同的。
default-src 'none';   
script-src 'self' 'nonce-somerandomvalue-differnt-foreach-reasone' 'unsafe-eval';  
style-src 'self' 'unsafe-inline';   
img-src 'self' data:;   
font-src 'self';    
object-src 'self';   
connect-src 'self';   
report-uri /csp/report;   

该应用程序在某些页面上使用内联JavaScript。因此,为了修复内联脚本违规问题,我在脚本标签中添加了相同的nonce值。
<script type="text/javascript" nonce="somerandomvalue-differnt-foreach-reasone">
这里重要的一点是,nonce值需要与标头中的nonce值匹配。详情请参见此处
我实现了中间件和标记辅助程序,将nonce添加到标头和脚本标记中。并确保页面呈现时两个nonce值匹配。
然后,只是为了测试目的,在一个页面上添加了没有nonce的脚本。
<script type="text/javascript">
    $(function () {
        alert('i am hacker');
    })
</script>

谷歌浏览器检测到此违规行为并按预期阻止了上述脚本。然而,在IE 11中,上述脚本可以执行而没有任何违规行为。同样,我确保IE中的标头是X-Content-Security-Policy

为什么IE 11没有阻止脚本?

1个回答

19

IE 11不支持使用nonce属性和nonce-源值。

IE11只支持sandbox指令,忽略所有其他CSP指令。

因此,您可以完全删除X-Content-Security-Policy头中的'nonce-somerandomvalue-differnt-foreach-reasone'部分,IE11仍然允许内联脚本。

无论您做什么,IE11都将允许内联脚本,除非您的服务器发送带有X-Content-Security-Policy: sandbox头的响应,在这种情况下,它将禁止所有脚本。唯一放松的方法是发送X-Content-Security-Policy: sandbox allow-scripts,但这将允许所有脚本,包括内联脚本。

因此,我认为在IE11中没有办法告诉它仅禁止内联脚本。您只能告诉IE11要么允许所有脚本,要么不允许任何脚本。


另请注意:IE11发布于2013年,早于在任何地方指定nonce属性的第一个CSP草案规范是在2014年左右。

http://caniuse.com/#feat=contentsecuritypolicy详细介绍了浏览器对CSP1指令的支持情况:

Internet Explorer 10-11的部分支持是指浏览器只通过使用X-Content-Security-Policy头支持“sandbox”指令。

nonce 属性是 CSP2 特性之一。请参见 http://caniuse.com/#feat=contentsecuritypolicy2

Edge 15 开始支持 nonce 和其他 CSP2 特性。因此,Edge 14 及更早版本不支持 nonce 或其他新的 CSP2 特性。但 Edge12+ 完全支持 所有 CSP1 特性


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