CSP 在 NextJs 中阻止 Google Tag Manager 仍然使用 nonce

Posted

技术标签:

【中文标题】CSP 在 NextJs 中阻止 Google Tag Manager 仍然使用 nonce【英文标题】:CSP block Google Tag Manager in NextJs still using nonce 【发布时间】:2022-01-04 22:15:38 【问题描述】:

我在我的项目中使用谷歌标签管理器,但是当我添加 CSP 时,它会阻止 GTM。

CSP:

default-src https: http: 'strict-dynamic' 'nonce-NONCE-KEY' 'unsafe-inline' 'self' https://www.googletagmanager.com;

代码:

<html lang='es'>
    <Head nonce='NONCE-KEY'>
        <script
            nonce='NONCE-KEY'
            aria-hidden='true'
            dangerouslySetInnerHTML=
                            __html: `(function(w,d,s,l,i)w[l]=w[l]||[];w[l].push('gtm.start':
                new Date().getTime(),event:'gtm.js');var 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;var n=d.querySelector('[nonce]');
                n&&j.setAttribute('nonce',n.nonce||n.getAttribute('nonce'));f.parentNode.insertBefore(j,f);
                )(window,document,'script','dataLayer','$GTM_ID');`,
                        
        />
    </Head>
    <body aria-label='Cargando'>
        <noscript                  
            aria-hidden='true'
            dangerouslySetInnerHTML=
                            __html: `<iframe  src="https://www.googletagmanager.com/ns.html?id=$GTM_ID"   style="display:none;visibility:hidden"></iframe>`,
                        
        />
        <Main />
        <div id='tooltip' />
        <NextScript nonce='NONCE-KEY' />
    </body>               
</Html>

错误:

根据文档,仅添加 nonce 应该可以工作,因为出于安全原因,我不想将“unsafe-eval”指令添加到我的 CSP。

【问题讨论】:

【参考方案1】:

    从您的错误消息中不清楚它是由 GTM 还是其他脚本引起的。但是,只有在“自定义 HTML 标记”中使用自定义 javascript 变量名称时,GTM 才需要 'unsafe-eval'。 要摆脱 'unsafe-eval',您可以使用 custom templates 而不是自定义 JavaScript 变量名称。

    切勿使用基于default-src 指令的严格内容安全策略,因为它会导致fatal security consequences in Firefox。

【讨论】:

非常感谢,崩溃消息是由 GTM 引起的,因为我使用的是自定义 Javascript 变量,所以我对数据层变量进行了更改,并从我的应用程序中通过 push 方法发送了这些值。我还改进了策略,考虑到避免使用 default-src。谢谢!

以上是关于CSP 在 NextJs 中阻止 Google Tag Manager 仍然使用 nonce的主要内容,如果未能解决你的问题,请参考以下文章

在 NextJS、nginx 和 Material-ui(s-s-r) 中使用 CSP

NextJS - Google 字体未加载或显示在网站上

NextJS 谷歌翻译小部件

Nextjs getInitialProps 阻止了客户端的页面渲染?

Google analytics.js 和内容安全政策

为啥 CSP 安全标头会阻止 Iphone 上的谷歌地图?