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

2024-03-11

我有一个元标记,其中包含以下指令:

<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-supportSafari 发行说明 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关键字没有效果


事实证明这是一个字符集问题。

我设法得到了一个最小的可重现问题(经过一番尝试和错误,并且非常幸运!),并发现我的一个角色在 Safari 中渲染之前和之后具有不同的 sha。

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

Safari 渲染角色后,如下所示(即使在代码源中也是如此):

奇怪的是,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,
        },
    },
}),

我已经向苹果报告了这个问题,看看他们是否会考虑修复这个问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Safari 11.0.3 无法识别内容安全策略哈希 的相关文章

随机推荐

  • 在 Winforms (C#) 中使用 MVP 模式的后台工作程序

    我一直在尝试使用 MVP 模式重构应用程序的意大利面条代码 但现在我正在为此苦苦挣扎 具有调用 DoWork 方法 后台工作者 的按钮的表单 这是一个很长的操作 我的问题是 如果我将长操作从视图移到演示器中 那么如何将此操作的进度更改发送到
  • 在线更新C#程序

    问候 如果这个问题已经被问过 我很抱歉 我尝试过使用搜索功能 但找不到适合我情况的答案 我有一个真正简单的 C 表单应用程序 只有 1 个文件 一个 exe 我目前通过 4shared 分发了此内容 人们可以随意下载 然而 每次我对程序进行
  • Matplotlib 颜色图 – 为每个图形/线条/主题选择不同的颜色

    我创建了一个读取并绘制 txt 文件及其内容 数字 值 的脚本 每个 txt 文件位于不同的文件夹中 每个文件夹又代表数据来源的一个主题 这段代码工作正常 Python 读取每个 txt 文件并将 23 个单独的图形 线条绘制成一个图 Py
  • jQuery 验证代码如何工作

    我发现这个教程使用 jQuery 和验证插件来验证表单输入 请参阅此处的工作示例 http jsfiddle net nK7Pw http jsfiddle net nK7Pw 这似乎工作正常 但是我有一个问题 在html部分中 没有提到错
  • Rails 4 更新嵌套属性

    更新嵌套属性附加而不是更新有很多关系 我正在尝试使用 Rails 4 Update attributes Class Person
  • Xamarin 表单 MessagingCenter 取消订阅未按预期工作

    当我在应用程序中多次来回导航时 MessagingCenter Subscribe 内编写的功能会被多次调用 但每次在订阅之前 我都会在构造函数中取消订阅 如下所示 但它仍然不起作用 MessagingCenter Unsubscribe
  • 提交表单后JQuery发送post请求?

    你好朋友 这是我的代码 用于表单提交 然后发送帖子链接 但表单提交成功 然后不发送帖子链接 document getElementById pitch image path form submit function e post submi
  • 应替换现有类型,添加新类型

    我有一个基地std vector和一个std initializer list
  • C编码:只读取带小数的浮点数,拒绝整数和特殊字符

    我正在尝试用 C gcc 编写代码以仅接受带小数的浮点数并拒绝整数 特殊字符 字母数字条目 有效条目是 1 23 3 45 6 77 无效条目 abc e34 834ww 6 9 还有一些不是浮动的废话 这是我尝试过的 include
  • 如何获取 Rails 控制器中活动存储中存储的附件的 URL

    如何获取存储在 Rails 控制器的活动存储中的 has one 模型附件的 URL 因此 我可以将其作为完整链接作为 json 中的 api 发送 到目前为止 我已经尝试过以下方法 但每个方法都给出了不同的问题 current user
  • 组合两个 matplotlib 颜色图

    我想将两个颜色图合并为一个 这样我就可以使用一个cmap一个用于负值 另一个用于正值 目前 我使用屏蔽数组来完成此操作 并用一张图像绘制一张图像cmap以及另一个图像与另一个图像 结果是 有以下数据 dat np random rand 1
  • 使用 Clearcase 递归签入

    我想将一个目录和所有子目录签入到透明案例中 有具体的命令可以实现吗 目前我正在进入每个目录并手动检查每个文件 我会推荐这个问题 https stackoverflow com questions 33577 how do i perform
  • 如何在 JavaScript 中循环遍历 JSON 关联数组?

    我从服务器收到 JSON 响应 并且必须在 javascript 中循环遍历数组并获取值 但我似乎无法循环遍历它 数组的 JSON 响应如下所示 1 Schools 20 Profiles 31 Statistics 44 Messages
  • 在 Facelet 模板中包含非 Facelet 内容

    有没有办法将 html 文件的内容插入到 Facelet 模板中 Facelets 标签不起作用 因为它仅用于包含 Facelet 内容 换句话说 我正在寻找相当于 JSP include 指令的 Facelets 我可能不明白你需要什么
  • 如何等待一组异步回调函数?

    我的代码在 javascript 中看起来像这样 forloop async call returns an array to its callback 所有这些异步调用完成后 我想计算所有数组的最小值 我怎样才能等到他们所有人呢 我现在唯
  • TFS 电子邮件通知

    当我在 TFS 中添加错误 工作项 并将其分配给用户时 我希望向该用户发送一封电子邮件 此外 如果现有错误的 分配给 发生更改 我希望该用户收到一封电子邮件 当用户在 TFS 2008 中分配了更改的错误时 是否可以向用户发送警报 至少在
  • 指令在 Spray 中如何工作?

    我想了解 Spray 中的指令如何工作 根据文档 http spray io documentation 1 1 SNAPSHOT spray routing key concepts directives 指令的一般结构如下 name a
  • 通过WCF发送图像的有效方法?

    我正在通过从头开始编写 VNC 等自定义远程控制应用程序来学习 WCF LINQ 和其他一些技术 我创建它时考虑了三个主要目标 服务器将在应用程序级别 即无缝窗口 提供 远程控制 而不是完整的桌面访问 客户端可以选择服务器上运行的任意数量的
  • 内存分配和 **argv 参数[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我知道我们使用这个论证的目的 我什至知道如何使用这个论证 只有一件事我仍然不明白 程序如何为来自输入的字符串分配内存 argv 在程序开始时
  • Safari 11.0.3 无法识别内容安全策略哈希

    我有一个元标记 其中包含以下指令 然后 我在页面下方有 2 个内联脚本 每个脚本都应与策略中生成的 sha 之一匹配 在 Chrome 和 Firefox 中 我没有收到任何投诉 我的脚本按预期运行 在 Safari 版本 11 0 3 1