如何让Google标签管理器和Content-Security-Policy共存?
How to make Google Tag Manager and Content-Security-Policy coexist?
Content-Security-Policy (CSP) header 旨在保护您的应用程序免受网络应用程序中的恶意资源注入。为简单起见,您为所有图像、脚本、样式等提供允许域来源的白名单。
与此同时,营销团队正在使用 Google Tag Manager (GTM) 来管理标签。原理是从页面收集信息,将它们发送到 GTM 并使用这些数据作为变量来生成标签,模板化 JS/HTML 和那些变量的混合。
问题是这些标签中的大多数都包含 javascript,用于向跟踪器、广告服务器或任何合作伙伴发送非常具体的数据。假设我的营销团队了解安全风险并且不会包含恶意脚本。
有没有办法知道 GTM 导入了哪些域,以便可以将它们自动添加到我的 CSP 上?
我认为没有直接开箱即用的方法。
您可以做的是使用 GTM API (https://developers.google.com/tag-manager/api/v1/reference/accounts/containers/tags/list),您基本上可以在其中遍历所有 Custom HTML 和 Custom图片 标签并收集主机名
这是个大问题,令我惊讶的是关于这方面的信息如此之少。当心任何建议在您的 CSP 中设置 unsafe-inline 的解决方案,因为这会使策略变得如此脆弱,几乎毫无用处。
为了回答您的直接问题,无法以编程方式知道 GTM 使用了哪些域。我建议将 CSP 设置为仅报告模式,并使用错误作为创建白名单的指南。
为了回答如何使它们共存的更广泛的问题,主要解决方案是使用 nonce 值和此处描述的可感知 nonce 的 GTM 脚本 Google 这里 https://developers.google.com/tag-manager/web/csp.
简而言之:
- 生成随机数值 - 这需要在每次页面加载时完成才能生效
- 在您的 CSP 中将 nonce 列入白名单
- 将其应用于任何包含 GTM 的内联脚本
- 将 GTM 加载的资源使用的所有主机列入白名单
但是,这个解决方案是不完整的,因为 GTM 似乎没有将 nonce 传播到任何自定义 HTML 标签。为此,您必须:
- 向 GTM 脚本标签的随机数感知版本添加一个 ID,例如“gtm_script” - 这将用于定位元素并捕获随机数
- 添加将存储 nonce 值的数据属性,例如data-nonce="[这里是你的 nonce 值]"
- 在 GTM 中,创建一个新变量来捕获随机数。使用 DOM 元素类型和 select GTM 片段的 ID(本指南中的 gtm_script),然后从数据属性
中获取随机数值
- 在 GTM 中,将 nonce 值添加到任何自定义 HTML 脚本
- 在 GTM 中,使用复选框启用支持 document.write
如需更详尽的指南,包括 GTM 的屏幕截图,请参阅本文 https://rbultitudezone.medium.com/tag-manager-services-and-website-security-using-gtm-with-csp-5749a610c600
Content-Security-Policy (CSP) header 旨在保护您的应用程序免受网络应用程序中的恶意资源注入。为简单起见,您为所有图像、脚本、样式等提供允许域来源的白名单。
与此同时,营销团队正在使用 Google Tag Manager (GTM) 来管理标签。原理是从页面收集信息,将它们发送到 GTM 并使用这些数据作为变量来生成标签,模板化 JS/HTML 和那些变量的混合。
问题是这些标签中的大多数都包含 javascript,用于向跟踪器、广告服务器或任何合作伙伴发送非常具体的数据。假设我的营销团队了解安全风险并且不会包含恶意脚本。
有没有办法知道 GTM 导入了哪些域,以便可以将它们自动添加到我的 CSP 上?
我认为没有直接开箱即用的方法。 您可以做的是使用 GTM API (https://developers.google.com/tag-manager/api/v1/reference/accounts/containers/tags/list),您基本上可以在其中遍历所有 Custom HTML 和 Custom图片 标签并收集主机名
这是个大问题,令我惊讶的是关于这方面的信息如此之少。当心任何建议在您的 CSP 中设置 unsafe-inline 的解决方案,因为这会使策略变得如此脆弱,几乎毫无用处。
为了回答您的直接问题,无法以编程方式知道 GTM 使用了哪些域。我建议将 CSP 设置为仅报告模式,并使用错误作为创建白名单的指南。
为了回答如何使它们共存的更广泛的问题,主要解决方案是使用 nonce 值和此处描述的可感知 nonce 的 GTM 脚本 Google 这里 https://developers.google.com/tag-manager/web/csp.
简而言之:
- 生成随机数值 - 这需要在每次页面加载时完成才能生效
- 在您的 CSP 中将 nonce 列入白名单
- 将其应用于任何包含 GTM 的内联脚本
- 将 GTM 加载的资源使用的所有主机列入白名单
但是,这个解决方案是不完整的,因为 GTM 似乎没有将 nonce 传播到任何自定义 HTML 标签。为此,您必须:
- 向 GTM 脚本标签的随机数感知版本添加一个 ID,例如“gtm_script” - 这将用于定位元素并捕获随机数
- 添加将存储 nonce 值的数据属性,例如data-nonce="[这里是你的 nonce 值]"
- 在 GTM 中,创建一个新变量来捕获随机数。使用 DOM 元素类型和 select GTM 片段的 ID(本指南中的 gtm_script),然后从数据属性 中获取随机数值
- 在 GTM 中,将 nonce 值添加到任何自定义 HTML 脚本
- 在 GTM 中,使用复选框启用支持 document.write
如需更详尽的指南,包括 GTM 的屏幕截图,请参阅本文 https://rbultitudezone.medium.com/tag-manager-services-and-website-security-using-gtm-with-csp-5749a610c600