如何将 Google 的全局站点标签与子资源完整性结合起来?

Posted

技术标签:

【中文标题】如何将 Google 的全局站点标签与子资源完整性结合起来?【英文标题】:How can I combine Google's Global Site Tag with Subresource Integrity? 【发布时间】:2018-12-09 09:34:58 【问题描述】:

我正在按照steps described by Google 在我的网站上实施全球跟踪。但我也想让我的Subresource Integrity (SRI) 保持最新状态。所以我运行以下命令来查找gtag.js 的完整性哈希。

> curl -s https://www.googletagmanager.com/gtag/js |\
  openssl dgst -sha384 -binary |\
  openssl base64 -A

将此作为完整性属性添加到具有crossorigin="anonymous" 属性的script 标记,会导致浏览器无法加载gtag 脚本。原因:

子资源完整性:资源“https://www.googletagmanager.com/gtag/js”具有完整性属性,但该资源要求请求启用 CORS 以检查完整性,但事实并非如此。由于无法强制执行完整性,该资源已被阻止。

明显的原因是 google 返回的 access-control-allow-origin 标头,并且只允许同一主机来源。

有谁知道这个脚本是否有不同的主机?还有其他方法可以在您的网站中采用 gtag 吗?

【问题讨论】:

您是否在其他地方找到了答案/解决方案? 不,我没有。我也尝试通过论坛和反馈向谷歌询问,但没有任何回应。 【参考方案1】:

解决此问题的唯一方法可能是简单地获取资源,将其存储在同一服务器上,然后设置您自己的 Access-Control-Allow-Origin 标头。

这有点傻 - 因为它不仅降低了通过 CDN 分发资源的价值,而且有效地使 SRI 毫无意义(因为您使用的是静态本地副本,而不是远程副本,因此需要减少通过 SRI 进行验证的风险)。

这也仅在资源保持静态时才有效。但由于 SRI 依赖资源是静态的(以便哈希匹配),因此对服务器上资源的任何更改都会导致 SRI 强制执行,从而导致资源无论如何都失败。

因此它可能并不比首先使用 SRI 更脆弱(除非您正在动态生成资源的校验和......此时首先使用 SRI 的意义较小) .

2020 年 9 月 22 日更新:看起来像 2020 年 4 月 Google 方面的问题 may have been resolved。

【讨论】:

以上是关于如何将 Google 的全局站点标签与子资源完整性结合起来?的主要内容,如果未能解决你的问题,请参考以下文章

如何将sitemap.xml添加到angularJS站点?

将 Google Analytics.js 转换为 gtag.js?

当代码具有不完整的 java doc 标签时,Maven 站点因 Java 8 而失败

3.2.4 Google Tag Manager实战指南——跨站跟踪

如何从 Google 电子表格中的 Google Apps 脚本自动更新“站点地图”功能?

附实例!实现iframe父窗体与子窗体的通信