内容安全策略在Internet Explorer 11中不起作用

时间:2017-03-21 20:06:05

标签: internet-explorer asp.net-core internet-explorer-11 content-security-policy coreclr

在我的每个响应的asp.net核心应用程序中,我正在添加内容安全策略标头。我理解,对于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值需要与header中的nonce值匹配。 some details here

我实施了中间件&amp; tag-helper将nonce添加到header&amp;脚本标签分别。我确保在页面渲染时两个nonce值都匹配。

然后,为了在页面上进行测试,我添加了脚本没有随机数

<script type="text/javascript">
    $(function () {
        alert('i am hacker');
    })
</script>

Google Chrome检测到此违规行为并按预期阻止上述脚本。但是在上面的IE 11中,脚本被执行而没有任何违规。再次,我确保IE中的标题是X-Content-Security-Policy

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

2 个答案:

答案 0 :(得分:11)

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

The only CSP directive IE11 supports is the sandbox directive。它忽略了所有其他CSP指令。

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

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

所以我认为在IE11中没有办法告诉它不允许内联脚本。您只能告诉IE11允许所有脚本,或者不允许任何脚本。

另请注意:IE11于2013年发布,早在任何地方指定nonce属性之前。我认为第一个CSP草案规范指出了nonce属性是在2014年的某个时候。

http://caniuse.com/#feat=contentsecuritypolicy详细介绍了CSP1 directives的浏览器支持:

  

Internet Explorer 10-11中的部分支持是指浏览器仅使用X-Content-Security-Policy标头支持“沙盒”指令。

nonce属性为a CSP2 feature。见http://caniuse.com/#feat=contentsecuritypolicy2

Support for nonce and other CSP2 features was added in Edge 15。因此Edge 14及更早版本不支持nonce或其他新的CSP2功能。但Edge12 +完全支持all of CSP1

答案 1 :(得分:0)

这可能有点晚了。

我的公司刚刚重新发布了 Scriptlock (www.scriptlock.com)。这是 2011 年构思的 JavaScript 库,能够实现您想要的功能。

最新版本将我们的原始机制与基于 CSP 的新机制相结合,以非常接近地改进/模拟 CSP2.0 script-src 指令(包括 CSP2.0“nonce-”)在 CSP 之前的浏览器和CSP1.0 浏览器。

它在三种模式下工作:

  • 在 CSP 之前的浏览器(包括 IE11)上,该机制针对 JavaScript 语言和 DOM 的脆弱部分,否则这些部分将允许 XSS 修改您的网页或从您的网站传输数据。它用包装函数替换易受攻击的本机函数,然后使用 Object.defineProperty 在原型级别锁定更改。基于堆栈跟踪的算法允许包装函数在代码执行期间确定 URL 和 nonce 来源,从而防止从不受信任的来源执行。
  • 在 CSP1.0 浏览器上,系统解析被阻止的“不安全内联”SCRIPT 元素,如果它们具有有效的随机数属性,则执行它们,有效地模拟 CSP2.0 随机数。同步脚本用于确保内联脚本在与外部脚本混合时以正确的顺序执行。
  • 在 CSP2.0 浏览器上,系统会正常降级以允许 CSP2.0 nonce 正常工作。

Scriptlock 在所有浏览器上提供了许多额外的措施,其中最有用的是 CSP2.0 标准的扩展,为内联事件处理程序提供 nonce 支持。我发现这非常有用,因为在将网站转换为 CSP 时,它不需要将内联事件处理程序移动到事件侦听器。这意味着网站可以轻松迁移到 CSP。

由于在 CSP 之前的浏览器上使用的基于堆栈跟踪的算法依赖于 JS 异常,因此在 IE11 等具有相当慢的异常机制的情况下,它的性能不是很好。因此,像 TinyMCE 这样大量且持续使用页面修改功能的工具将像 slug 一样运行。但如果需要,您可以修改个别页面上的政策来解决这个问题。