有没有办法在新的 Google 网站上允许来自 Cloudflare 的脚本?

问题描述

我使用新的 Google 网站(不是经典网站)创建了一个网站,通过 Cloudflare 设置了网站代理,并启用了 Cloudflare 中的 Email Address Obfuscation 功能。然后我添加一个按钮来执行一个简单的操作 mailto:info@example.com 并遇到了一个问题:当我点击按钮时,我被带到 Cloudflare“电子邮件保护”页面,并显示消息“您无法访问此电子邮件地址example.com”。

这是一个简单的原因 - 我的浏览器(任何现代浏览器都会发生这种情况)不会从 Cloudflare 加载 email-decode.min.js 脚本。反过来,这是因为 Google Sites 使用 CSP >= v2 并且 CSP 指令的配置方式不允许加载来自 Cloudflare 的脚本。

根据 Cloudflare 文档,为了使用 Scrape Shield,您需要 update CSP headers 如下:

script-src 'self' 'unsafe-inline'

这是新的 Google 协作平台 CSP 标头的样子:

base-uri 'self';
object-src 'none';
report-uri /_/view/cspreport;
script-src 'report-sample' 'nonce-7+8CsMF6KihKnNmDwfM84w' 'unsafe-inline' 'unsafe-eval';
worker-src 'self';
frame-ancestors https://google-admin.corp.google.com/

* nonce-<base64-value> 随每个请求更新。

加载包含电子邮件页面时,我在浏览器控制台中看到以下错误

Refused to load the script 'https://example.com/cdn-cgi/scripts/6d6ddgh8/cloudflare-static/email-decode.min.js' because it violates the following Content Security Policy directive: "script-src 'report-sample' 'nonce-7+8CsMF6KihKnNmDwfM84w' 'unsafe-inline' 'unsafe-eval'". Note that 'script-src-elem' was not explicitly set,so 'script-src' is used as a fallback.

我不确定原因,但由于以下两个原因之一无法加载脚本:

  1. 未为 'self' 指令设置源 script-src(我认为不是这种情况)。
  2. 'unsafe-inline' 被忽略,因为存在加密随机数。

无论如何都行不通。我看到了两种解决方案,但我不知道如何实施它们:

  1. 对于第一个原因(尽管我不认为是这种情况),如果 Google 将源 'self' 添加script-src 指令中,或者如果我能够自定义这个标题,我会自己做。
  2. 对于第二个原因,如果 Cloudflare 在请求网站时读取 Google 服务器返回的 'nonce-<base64-value>' 并将其添加到其脚本中,则可以解决此问题。

如果有人能分享这个问题的解决方案,我们将不胜感激。

解决方法

所以我发现原因是 'self' 指令中缺少 script-src 源。

我发现一个 forum thread 建议使用 Cloudflare Workers 即时更改请求/响应中所需的数据。我还为允许替换请求/响应中的标头的工作人员找到了 ready-made example code

受到这个想法的启发并考虑到 Cloudflare 每天免费提供 100,000 个请求,我编写并部署了一个工作代码来更改服务器响应标头,实际上,它更新了 {{1} 中的 script-src 指令}} 标头,用变量 content-security-policy 中指定的来源对其进行补充。

我的问题解决了,现在 Cloudflare 脚本正在加载并且按钮可以工作了。

* 我不保证代码质量,但它有效。代码可以变得更加通用,但我没有时间这样做。

这是我的工作代码:

sources

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...