扩展默认情况下对其应用了内容安全策略。默认策略限制了它们可以从中加载<script>和<object>资源的来源,并且禁止使用诸如之类的潜在不安全做法eval()。请参阅默认内容安全性策略以了解有关此含义的更多信息。
您可以使用"content_security_policy"
清单密钥来放松或收紧默认策略。该密钥的指定方式与Content-Security-Policy HTTP标头相同。有关CSP语法的一般说明,请参见使用内容安全策略。
例如,您可以使用此键执行以下操作:
- 通过在script
-src
或object-src
指令中提供脚本和对象的URL,允许扩展程序从其程序包外部加载脚本和对象。 - 通过在script-src指令中提供脚本的哈希值,允许扩展程序执行内联脚本。
eval()
通过包含'unsafe-eval'
在script-src指令中,允许扩展使用和类似的功能 。- 使用适当的策略指令policy directive(另一篇文章详细介绍),将允许的来源限制为其他类型的内容,例如图像和样式表。
您可以在此处指定政策的限制:
- 该策略必须至少包含 script-src和 object-src指令,并且该 script-src指令必须包含关键字
'self'
。 - 远程源必须使用
https:
方案。 - 远程源不得在公共后缀列表中的任何域中使用通配符(因此,虽然允许“ * .foo.blogspot.com”,但不允许“ * .co.uk”和“ * .blogspot.com”)。
- 所有源都必须指定一个主机。
- 对于源唯一允许方案是:
blob:
,filesystem:
,moz-extension:
,和https:
。 - 唯一允许的关键词(default-src指令用作其他CSP fetch指令的后备)是:
'none'
,'self'
,和'unsafe-eval'
。
例
有效的例子
允许从“https://example.com”远程脚本:
<span style="color:#333333"><code class="language-json"><span style="color:#990055">"content_security_policy"</span><span style="color:#9a6e3a">:</span> <span style="color:#669900">"script-src 'self' https://example.com; object-src 'self'"</span></code></span>
允许来自“ jquery.com”的任何子域的远程脚本:
<span style="color:#333333"><code class="language-json"><span style="color:#990055">"content_security_policy"</span><span style="color:#9a6e3a">:</span> <span style="color:#669900">"script-src 'self' https://*.jquery.com; object-src 'self'"</span></code></span>
允许的eval() and friends:
<span style="color:#333333"><code class="language-json"><span style="color:#990055">"content_security_policy"</span><span style="color:#9a6e3a">:</span> <span style="color:#669900">"script-src 'self' 'unsafe-eval'; object-src 'self';"</span></code></span>
允许内联脚本"<script>alert('Hello, world.');</script>"
:
<span style="color:#333333"><code class="language-json"><span style="color:#990055">"content_security_policy"</span><span style="color:#9a6e3a">:</span> <span style="color:#669900">"script-src 'self' 'sha256-qznLcsROx4GACP2dm0UCKCzCG+HiZ1guq6ZZDob/Tng='; object-src 'self'"</span></code></span>
保留其余策略,但还要求将映像与扩展名打包在一起:
<span style="color:#333333"><code class="language-json"><span style="color:#990055">"content_security_policy"</span><span style="color:#9a6e3a">:</span> <span style="color:#669900">"script-src 'self'; object-src 'self'; img-src 'self'"</span></code></span>
要求所有类型的内容都应使用扩展名打包:
<span style="color:#333333"><code class="language-json"><span style="color:#990055">"content_security_policy"</span><span style="color:#9a6e3a">:</span> <span style="color:#669900">"default-src 'self'"</span>
</code></span>
无效的例子
忽略该"object-src"
指令的策略:
<span style="color:#333333"><code class="language-json"><span style="color:#990055">"content_security_policy"</span><span style="color:#9a6e3a">:</span> <span style="color:#669900">"script-src 'self' https://*.jquery.com;"</span></code></span>
忽略指令中"self"
关键字的策略"script-src"
:
<span style="color:#333333"><code class="language-json"><span style="color:#990055">"content_security_policy"</span><span style="color:#9a6e3a">:</span> <span style="color:#669900">"script-src https://*.jquery.com; object-src 'self'"</span></code></span>
远程源方案不是https
:
<span style="color:#333333"><code class="language-json"><span style="color:#990055">"content_security_policy"</span><span style="color:#9a6e3a">:</span> <span style="color:#669900">"script-src 'self' http://code.jquery.com; object-src 'self'"</span></code></span>
通配符与通用域一起使用:
<span style="color:#333333"><code class="language-json"><span style="color:#990055">"content_security_policy"</span><span style="color:#9a6e3a">:</span> <span style="color:#669900">"script-src 'self' https://*.blogspot.com; object-src 'self'"</span></code></span>
源指定一个方案,但没有主机:
<span style="color:#333333"><code class="language-json"><span style="color:#990055">"content_security_policy"</span><span style="color:#9a6e3a">:</span> <span style="color:#669900">"script-src 'self' https:; object-src 'self'"</span></code></span>
指令包含不受支持的关键字'unsafe-inline'
:
<span style="color:#333333"><code class="language-json"><span style="color:#990055">"content_security_policy"</span><span style="color:#9a6e3a">:</span> <span style="color:#669900">"script-src 'self' 'unsafe-inline'; object-src 'self'"</span></code></span>
1. 注意:有效的示例显示了CSP中密钥的正确使用。但是,由于重大安全问题,addons.mozilla.org上列出的扩展名不允许使用CSP中带有'unsafe-eval','unsafe-inline',远程脚本,blob或远程源的扩展名。
浏览器兼容性