【问题标题】:GTM nonce-aware script does not work on all browsers for Custom HTML tagsGTM nonce-aware 脚本不适用于自定义 HTML 标记的所有浏览器
【发布时间】:2021-06-10 08:51:40
【问题描述】:

我有一个使用 SSR 的 Vue 应用程序。为了实现 Content-Security-Policy,我使用了nonce-aware version of GTM snippet

但它并没有将nonce 添加到 gtm 注入页面的所有脚本(特别是自定义 HTML 标记)。我按照提到的解决方案here 解决了 Safari 上的问题。但它在 ChromeFirefoxEdge 上不起作用,我仍然看到这些标签的错误:

这是我的 CSP 设置:

default-src 'self';
base-uri 'self';
block-all-mixed-content;
font-src 'self' https: https://fonts.gstatic.com data:;
img-src 'self' https: data: https://www.google-analytics.com https://ssl.gstatic.com  https://www.gstatic.com https://www.googletagmanager.com;
object-src 'none';
script-src 'self' 'nonce-b62382357618aee340fc9dc596c94a19' https://www.google-analytics.com/ https://ssl.google-analytics.com https://tagmanager.google.com https://www.googletagmanager.com 127.0.0.1:*;
script-src-attr 'none';
style-src 'self' 'unsafe-inline' https://tagmanager.google.com https://fonts.googleapis.com;
upgrade-insecure-requests;
connect-src 'self' https://www.google-analytics.com https://stats.g.doubleclick.net;

经过数小时的研究,我发现了以下评论:

Chrome 会屏蔽 nonce 属性值,因此标签管理器无法抓取它并将其存储为变量。

我不确定这是否真的是问题,但谁能解释我如何在不使用 unsafe-inline 或哈希的情况下解决此问题,因为似乎即使在 Google 文档中也没有解决此问题的标准方法?

【问题讨论】:

  • @granty 感谢您的回复。在创建这个问题之前,我已经看到了这个问题。我按照那里提供的步骤并勾选了 Support document.write 复选框,并确认我在每个自定义 HTML 项目中看到了 nonce attr。但问题是它只能在 Safari 上运行,而不能在 Chrome、Firefox 和 Edge 上运行。我使用的是 Mac Catalina 10.15.1,所有浏览器都是最新版本。还有其他可以解决此问题的想法吗?
  • 我只能在 Safari 上看到我放在 GTM 脚本标签中的日志。不在其他人身上。我清除了浏览器缓存,在隐身模式下对其进行了测试,但它们都不起作用。

标签: google-chrome google-analytics google-tag-manager content-security-policy vue-ssr


【解决方案1】:

在网上搜索了很多并阅读了不同的文章后,我发现here 提到的解决方案在 Safari 中运行良好,但在其他浏览器中却不行,因为:

Chrome、Safari 和 Edge 屏蔽了 nonce 属性值,因此 GTM 无法抓取它并将其存储为变量。

考虑到 this solutionnonce 传播到自定义 HTML 标记,我们继续应用以下更改来解决 Chrome、Firefox 和 Edge 上的此问题。 正如here in the comments 建议的那样,我们需要稍微修改一下nonce-aware 脚本并将nonce 放入data- 属性中(这样浏览器就不会屏蔽它),并将其推送到dataLayer:

<!-- Google Tag Manager -->
<script
  nonce='{{YOUR_GTM_NONCE}}'
  data-gtm-nonce='{{YOUR_GTM_NONCE}}'
>
  (function(w,d,s,l,i){
    const gtmNonce = d.querySelector('[data-gtm-nonce]').dataset.gtmNonce;
    w[l]=w[l]||[];
    w[l].push({'nonce': gtmNonce});
    w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});
    const f=d.getElementsByTagName(s)[0],j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';
    j.async=true;
    j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;
    j.setAttribute('nonce', gtmNonce);
    f.parentNode.insertBefore(j,f);
  })(window,document,'script','dataLayer','YOUR_GTM_ID');
</script>
<!-- End Google Tag Manager -->

然后在 GTM 中,您需要更改基于 this solution 定义的 nonce 变量从此

对此

其余部分保持不变。

【讨论】:

  • 经过一番思考后,我会做出 2 处更改: 1. 删除属性“data-gtm-nonce” - 这不安全。如果要显示 nonce 值,则可以使用 CSS atack。 2.获取类似于GTM脚本的nonce值: var n = d.querySelector('[nonce]'); var h = n.nonce || n.getAttribute('nonce'); w[l] = w[l] || []; w[l].push({ nonce: h }); ...(其他代码)。我还提交了 GTM 变量配置修复:support.google.com/tagmanager/thread/125251086/…
猜你喜欢
  • 2018-01-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-23
  • 2015-09-29
相关资源
最近更新 更多