gpt4 book ai didi

safari - Safari 11.0.3 无法识别内容安全策略哈希

转载 作者:行者123 更新时间:2023-12-03 22:17:46 27 4
gpt4 key购买 nike

我有一个包含以下指令的元标记:

<meta http-equiv="Content-Security-Policy" content="base-uri 'self'; script-src 'self' 'sha256-s5EeESrvuQPpk2bpz5I3zn/R8Au2DYB1Z+YUH9p0fUE=' 'sha256-PYYfGnkbZ44B9ZBpgv8NbP3MXT560LMfrDSas2BveJo=';">

然后我在页面下方有 2 个内联脚本,每个脚本都应与策略中生成的 shas 之一匹配。

在 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 中对我有用,因此它让我相信它与我的应用程序中的特定内容有关,可能与我拥有的第二件事有关下面试过。

任何帮助将非常感激!

我尝试过的事情:

是否支持哈希?

根据 this Stack Overflow postSafari release notes , 支持哈希的 CSP 2.0 在 Safari 10 中实现

正确的字符集?

以前,我看到了一些问题,因为我正在计算基于 UTF-8 字符集的哈希值,但是在没有适当的字符集元标记的情况下将 JS 输出到浏览器。我的 JS 中的特殊字符被破坏,并在浏览器尝试计算它们时导致 shas 的差异。

我不相信这会影响我,因为 Chrome 和 Firefox 没有发现任何问题,但也许我在这里错了?

unsafe-inline Safari,然后允许哈希覆盖 Chrome 和 Firefox 中的哈希?

根据 CSP 规范, unsafe-inlineignored if a hash or nonce is present . Safari 11 也遵循这一点,因此添加了 unsafe-inline关键字没有效果

最佳答案

原来这是一个字符集问题。

我设法解决了一个最小的可重现问题(经过一些反复试验和很多运气!)并发现我的一个角色在 Safari 中渲染前后具有不同的 sha。

在 Safari 中渲染之前,角色如下:

Before Safari Rendered the Character

在 Safari 渲染了这个角色之后,它是这样的(甚至在代码的源代码中):

After Safari Rendered the Character

奇怪的是,Chrome 和 Firefox 都没有这个问题,所以要么必须是 Safari 在渲染后对字符进行规范化,要么是 sha256 的不同。哈希值是在浏览器之间计算的。

解决方案是在 UglifyJS 中关闭字符压缩,使字符保持为 \uF900而不是被压缩为上图中的单个字符。

我在 webpack.config.js 文件中使用以下选项实现了这一点:

new UglifyJsPlugin({
uglifyOptions: {
output: {
// necessary to stop the minification of escaped unicode sequences into their actual chars.
// some unicode breaks CSP checks in safari
ascii_only: true,
},
},
}),

我已经向 Apple 报告了这个问题,看看他们是否会考虑解决这个问题。

关于safari - Safari 11.0.3 无法识别内容安全策略哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48938671/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com