【问题标题】:Content-Security-Policy errors in Firefox and ChromeFirefox 和 Chrome 中的内容安全策略错误
【发布时间】:2020-04-11 15:36:16
【问题描述】:
在我的代码中,我设置如下:
response.setHeader("Content-Security-Policy", "default-src 'self'");
这在 Internet Explorer 中运行良好。
在 Chrome 中,我收到以下错误:
拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“default-src 'self'”。启用内联执行需要“unsafe-inline”关键字、哈希(“sha256-3o30MP9eULqjOPAYfNq0dz2I/NLmIV2JYJR7D96q+wM=”)或随机数(“nonce-...”)。另请注意,'script-src' 未明确设置,因此 'default-src' 用作后备。**
在 Firefox 中,我收到以下错误:
内容安全策略:页面的设置阻止了内联资源的加载(“default-src”)
我尝试添加 unsafe-inline 关键字,该关键字在 Chrome 中有效,但在 Firefox 中无效。
【问题讨论】:
标签:
javascript
http-headers
content-security-policy
【解决方案1】:
当你有这个时:
default-src 'self'
这意味着您只允许来自您的域的脚本。例如:
<script src='/js/example.js'></script>
或者
<script src='https://www.example.com/js/example.js'></script>
如果你尝试像这样使用内联脚本:
<script>
Some JavaScript
</script>
然后内容安全策略将阻止它。
您可以将其更改为允许这样的内联脚本:
default-src 'self' 'unsafe-inline'
这适用于 Chrome 和 Firefox,因此您需要提供更多详细信息,说明您尝试了什么以及在 Firefox 中遇到了什么错误,以便进一步调查。
请注意,这抵消了使用内容安全策略的许多好处 - 因此名称中的不安全 - 因为任何设法将 JavaScript 放在您的页面上的人(CSP 旨在防止的主要内容)仍然能够添加自己。理想情况下,您会将所有内联脚本移动到 .js 文件并以这种方式引用它们,因为将文件添加到您无法控制的域比将脚本添加到您无法控制的页面要困难得多。如果这是不可能的,那么还有更高级的方法,如错误消息所暗示的随机数和哈希。
【讨论】:
-
在下面尝试: response.setHeader("Content-Security-Policy", "default-src 'none'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; connect- src 'self'; img-src 'self'; style-src 'self' 'unsafe-inline'; object-src 'none'; frame-src 'none'; font-src 'self' fonts.gstatic.com;");
-
response.setHeader("Content-Security-Policy", "default-src 'none'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; connect-src 'self '; img-src 'self'; style-src 'self' 'unsafe-inline'; object-src 'none'; frame-src 'none'; font-src 'self' fonts.gstatic.com;"); 这个,很好用在 chrome 中。在 firefox/safari 中,它一直在等待 - 等待 localhost 而控制台中什么也没有。