在我的每个响应的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没有阻止脚本?
答案 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 浏览器。
它在三种模式下工作:
Scriptlock 在所有浏览器上提供了许多额外的措施,其中最有用的是 CSP2.0 标准的扩展,为内联事件处理程序提供 nonce 支持。我发现这非常有用,因为在将网站转换为 CSP 时,它不需要将内联事件处理程序移动到事件侦听器。这意味着网站可以轻松迁移到 CSP。
由于在 CSP 之前的浏览器上使用的基于堆栈跟踪的算法依赖于 JS 异常,因此在 IE11 等具有相当慢的异常机制的情况下,它的性能不是很好。因此,像 TinyMCE 这样大量且持续使用页面修改功能的工具将像 slug 一样运行。但如果需要,您可以修改个别页面上的政策来解决这个问题。