我有一个元标记,其中包含以下指令:
<meta http-equiv="Content-Security-Policy" content="base-uri 'self'; script-src 'self' 'sha256-s5EeESrvuQPpk2bpz5I3zn/R8Au2DYB1Z+YUH9p0fUE=' 'sha256-PYYfGnkbZ44B9ZBpgv8NbP3MXT560LMfrDSas2BveJo=';">
然后,我在页面下方有 2 个内联脚本,每个脚本都应与策略中生成的 sha 之一匹配。
在 Chrome 和 Firefox 中,我没有收到任何投诉,我的脚本按预期运行。
在 Safari 版本 11.0.3 (13604.5.6) 中,我收到以下错误:
Refused to execute a script because its hash, its nonce, or 'unsafe-inline' does not appear in the script-src directive of the Content Security Policy
我很困惑为什么!
不幸的是,我无法生成一个包含其中问题的最小可重复存储库 - 较小的示例在 Safari 中对我来说有效,所以它让我相信这与我的应用程序中的特定内容有关,可能与我的第二件事有关下面尝试过。
任何帮助将非常感激!
我尝试过的事情:
是否支持哈希值?
根据这个堆栈溢出帖子 https://stackoverflow.com/questions/44318505/safari-content-security-policy-support和Safari 发行说明 https://developer.apple.com/library/content/releasenotes/General/WhatsNewInSafari/Introduction/Introduction.html,支持哈希的CSP 2.0在Safari 10中实现
字符集正确吗?
之前,我遇到了一些问题,因为我是根据 UTF-8 字符集计算哈希值,但将 JS 输出到浏览器时却没有适当的字符集元标记。当浏览器尝试计算它们时,我的 JS 中的特殊字符被破坏并导致 shas 出现差异。
我不认为这会影响我,因为 Chrome 和 Firefox 没有发现任何问题,但也许我错了?
unsafe-inline
对于 Safari,然后允许哈希值覆盖 Chrome 和 Firefox 中的哈希值?
根据 CSP 规范,unsafe-inline
is 如果存在哈希值或随机数,则忽略 https://www.w3.org/TR/CSP2/#directive-script-src。 Safari 11 也遵循这一点,因此添加了unsafe-inline
关键字没有效果