【问题标题】:Safari Gives Error "Refused to connect to _____ because it does not appear in the connect-src directive of the Content Security Policy."Safari 出现错误“拒绝连接到 _____,因为它没有出现在内容安全策略的 connect-src 指令中。”
【发布时间】:2021-08-11 17:59:43
【问题描述】:

我有一个 Safari 用户无法连接的在线白板。他们从控制台获得以下信息。

Refused to connect to wss://whiteboard.[MYDOMAIN].com/[MOREPATHSTUFF] because it does not appear in the connect-src directive of the Content Security Policy.

只有 Safari 会这样做。 Chrome、FF、Edge 等工作正常。我查看了其他与 SO 相关的帖子,似乎 Safari 需要类似...

<meta http-equiv="Content-Security-Policy" content="
                        default-src * data: blob: ws: wss: gap://ready file://*;
                        style-src * 'unsafe-inline'; 
                        script-src * 'unsafe-inline' 'unsafe-eval';
                        connect-src * ws: wss:;">

我不知道这一切意味着什么。我想要的只是让 Safari 允许连接,一切都应该很好。感谢您考虑如何实现这一目标。

【问题讨论】:

    标签: safari content-security-policy


    【解决方案1】:

    我查看了其他与 SO 相关的帖子,似乎 Safari 需要类似...

    您已经通过 HTTP 标头或元标记 (how to check it) 发布了内容安全策略 (CSP),因为浏览器控制台中会显示一条违规消息。
    发布第二个 CSP 不能放松生成的策略,因为第一个 CSP 仍将执行阻塞。
    这就是为什么您无法通过添加元标记或 HTTP 标头来解决问题的原因。

    您必须弄清楚第一个 CSP 的发布位置并对其进行更改。

    只有 Safari 会这样做。 Chrome、FF、Edge 等都可以正常工作。

    Safari 支持 connect-src 指令,因此它的行为应该与 Chrome/Firefox/Edge 没有区别,除了一件事:Safari 会将 not support 升级为 ws:wss:
    对于connect-src ws:,Chrome/Firefox/Edge 将应用connect-src ws: wss: 策略,但 Safari 不会。

    我敢打赌,您的 CSP 中有 connect-src ws:,因此与 wss: 的所有连接都被阻止。
    当您找到您的 CSS 发布位置时,只需将 wss://whiteboard.[MYDOMAIN].com 添加到 connect-src 指令即可。

    注意:如果您使用的是default-src 指令而不是connect-src - 那么您需要将wss://whiteboard.[MYDOMAIN].com 添加到其中。

    更新
    如何发布 CSP 标头

    A)。 CSP 标头可以在您的 Web 应用程序本身中生成(头盔中间件、用于管理 HTTP 标头的特定包、通过res.setHeader() 直接发出 HTTP 标头等等)。

    B)。 CSP 标头可以由服务器发布。对于 Nginx,它应该在服务器配置中为 add_header Content-Security-Policy "default-src ... ";Several folders 可以用于此,但 etc/nginx/conf.d 是首选,其他已弃用。

    如果我同时以 A) 和 B) 两种方式发布 CSP 标头会怎样?

    服务器工作您的网络应用软件完成所有工作后,因此网络服务器(或代理服务器)应覆盖具有相同名称的 HTTP 标头。因此服务器可以覆盖任何由 Web 应用发布的 HTTP 标头。

    在某些情况下它不起作用,您可以看到 2 CSP headers 已发布。即使在这种情况下,您也可以创建trick

    proxy_hide_header Content-Security-Policy;
    

    然后在它下面,添加你需要的标题:

    add_header Content-Security-Policy "default-src 'self';";
    

    这可以用作临时解决方案,直到您弄清楚标头的真正发布位置。

    【讨论】:

    • 好收获!!我在响应标头中找到了content-security-policy: connect-src 'self';。现在.....如何找到设置的位置。我们为此使用了 Vue.js 3,我在所有文件中搜索了 content-security-policy。没什么。你有什么想法我应该在服务器上寻找这种东西吗?我可以访问 PuTTY,但我不知道很多命令。
    • 这很奇怪,因为 connect-src 'self' 不应该在 Chrome/FF/Edge 中允许 wss://whiteboard.[MYDOMAIN].com,除非页面是从 https://whiteboard.[MYDOMAIN].com 加载的。但是 Safari 也有一个带有 'self' 的错误 - 它涵盖了 http:/https: 但不像其他浏览器那样覆盖 ws:/wss:。 CSP响应头可以在Nginx config中设置,尝试搜索add_header Content-Security-Policy "default-src 'self'; connect-src 'self'"字符串。对于Node.js 服务器,CSP 标头可以由一些包设置,例如Helmetcsp-headernode-csp 等。
    • 找到两个“集群”。 1.) /etc/nginx/sites-enabled 中的三个不同的.conf 文件引用了add_header Content-Security-Policy "connect-src 'self';";。我尝试将它们全部更改,但响应标头区域没有任何变化。 2.) 在一些似乎与 node.js 相关的文件中,有几个像 res.setHeader('Content-Security-Policy', "default-src 'none'") 这样的东西。 #1 似乎更有希望,尽管因为 connect-src 'self'; 部分。想法?
    • 2.) res.setHeader('Content-Security-Policy', "default-src 'none'") 属于内置 NodeJS finalhandler,用于代码为 404/403 等的不存在页面。出于安全原因,它发布了自己的限制性 CSP,请不要更改它的 CSP。 1.)我在答案中添加了一些相关信息。
    • 搞定了!问题是我不知道您在进行更改后必须重新启动 nginx 服务。因此,早期的更改可能会奏效,但对于这个问题的未来发现者来说,这就是有效的。将wss://whiteboard.[MYDOMAIN].com;"; 添加到位于etc/nginx/ 的.conf 文件中的CSP 中。完整的 CSP 行是 add_header Content-Security-Policy "connect-src 'self' wss://whiteboard.[MYDOMAIN].com;";。谢谢格兰蒂!
    【解决方案2】:

    CSP 有一些不直观的特点。一种是:wss://example.com 这样的Websocket 不会被*.example.com 甚至* 等通配符捕获

    为了允许 websockets - 您需要使用wss://example.com 甚至ws: wss: 显式添加它们

    如果您只想允许 connect-src 上的任何内容,则添加 connect-src * ws: wss:; 您的政策应该有效(如您所述)。

    【讨论】:

    • 我只是想克服 Safari 的错误。根据您的回答,以下是否可行? &lt;meta http-equiv="Content-Security-Policy" content="connect-src wss://whiteboard.[MYDOMAIN].com/[MOREPATHSTUFF];"&gt;
    • 是的。请注意,Safari 对/[MOREPATHSTUFF] 具有独特的行为。在某些版本中,它被剥离或 CSP 报告 - 使其非常难以调试。由于connect-src 不是关键任务指令(如script-srcform-srcbase-uri),我建议不要添加路径粒度并保持connect-src wss://whiteboard.[MYDOMAIN].com; 另外-您可以通过HTTP 设置您的CSP响应标头而不是 HTML 元标记?这种方法会更方便 - 支持Content-Security-Policy-Report-Only 和更多指令。
    • 我不知道做 HTTP 响应头。我得找人谈一谈。此外,我尝试了&lt;meta http-equiv="Content-Security-Policy" content="connect-src * wss://whiteboard.[MYDOMAIN].com;"&gt; 并且 Safari 给出了与以前相同的错误。我错过了什么吗?
    • 我尝试了其他迭代,但没有任何效果。 &lt;meta http-equiv="Content-Security-Policy" content="connect-src 'self' [MYDOMAIN].com *.[MYDOMAIN].com;"&gt;&lt;meta http-equiv="Content-Security-Policy" content="connect-src * wss://whiteboard.[MYDOMAIN].com;"&gt; 都失败了。
    • 我想查看通过 HTTP 标头而不是元标记应用相同 CSP 的示例,并检查问题是否仍然存在。
    猜你喜欢
    • 2017-04-27
    • 2020-12-30
    • 2020-02-27
    • 2012-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多