如何使Google标签管理器和内容安全策略共存?

15

内容安全策略(CSP)头部旨在保护您的 Web 应用程序免受恶意资源注入。简单来说,您可以提供一个允许所有图像、脚本、样式等资源的白名单。

与此同时,市场营销团队使用Google 标签管理器(GTM)来管理标签。其原理是从页面收集信息,将其发送到 GTM,并使用这些数据作为变量生成标签,其中包括模板化 JS/HTML 和这些变量。

问题是,大多数标签都包含 JavaScript,用于向跟踪器、广告服务器或其他合作伙伴发送非常特定的数据。假设我的营销团队已经意识到安全风险并不会包含恶意脚本。

是否有一种方法可以知道 GTM 导入了哪些域,以便可以自动将它们添加到我的 CSP 中?


3
针对“自动”的给定值,您可以通过GTM API下载自定义图片标签和自定义HTML标签,并解析其中可能指示源域的字符串。然而,我认为当谈论安全功能时,“让我们假设没有人会进行恶意行为”并不是一个好的方法。最近我所做的一次演讲中的几张相关幻灯片可能有助于说明为什么:http://slideshare.net/EikePierstorff/unmanaged-tags-data-protection-in-the-age-of-mindless-proliferation - Eike Pierstorff
非常出色的演示,Youtube上表现更佳。您非常好地描述了GTM,“XSS即服务”,与CSP相冲突。由于谷歌创建了GTM,我认为使用它的人应该意识到安全风险,所以我假设提供给GTM的内容是安全的。无论如何,我会稍后考虑这个问题,感谢您的见解。 - Alain Tiemblo
2个回答

3
这是一个很大的问题,我很惊讶这方面的信息如此之少。请注意,不要使用建议将“unsafe-inline”设置为CSP中的任何解决方案,因为这会使策略变得非常薄弱,几乎没有用处。
回答你的直接问题,程序化地知道GTM使用哪些域名是不可能的。我建议将CSP设置为仅报告模式,并将错误用作创建白名单的指南。
回答更广泛的问题,使它们共存的主要解决方案是使用nonce值和支持nonce的GTM脚本,Google在这里描述了该过程:https://developers.google.com/tag-manager/web/csp
简而言之:
1. 生成一个nonce值-这需要在每个页面加载时完成才有效。 2. 在CSP中将nonce添加到白名单中。 3. 将其应用于包括GTM在内的任何内联脚本。 4. 将GTM加载的资源使用的任何主机添加到白名单中。
但是,该解决方案不完整,因为GTM似乎不会将nonce传播到任何自定义HTML标签。为了解决这个问题,您必须:
1. 向支持nonce的GTM脚本标记添加一个id,例如“gtm_script”-这将用于定位元素并捕获nonce。 2. 添加一个数据属性,用于存储nonce值,例如"data-nonce = [your nonce value here]"。 3. 在GTM中,创建一个新的变量以捕获nonce。使用DOM Element类型,选择GTM片段的ID(在本指南中为gtm_script),然后从数据属性获取nonce值。 4. 在GTM中,将nonce值添加到任何自定义HTML脚本中。 5. 在GTM中,启用使用复选框支持document.write。
有关更详尽指导,包括GTM截图,请参见此文章:https://rbultitudezone.medium.com/tag-manager-services-and-website-security-using-gtm-with-csp-5749a610c600

你能更详细地介绍一下GTMP的nonce传播吗?包括一些屏幕截图之类的东西吗?我有点迷失了。 - Adam Youngers
1
嗨@AdamYoungers,这里有一个非常有用的答案,可能会对你有所帮助:https://dev59.com/m1EG5IYBdhLWcg3wfviM - rjbultitude
你好,@AdamYoungers 我已经添加了一篇包含更多有关配置GTM的详细信息的文章链接。 - rjbultitude

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接