如何使Google跟踪代码管理器和内容安全政策共存?

时间:2016-12-05 12:35:13

标签: javascript security web google-tag-manager content-security-policy

Content-Security-Policy (CSP)标题旨在保护您的应用程序免受Web应用程序中的恶意资源注入。为简单起见,您需要为所有图像,脚本,样式等提供允许的域来源的白名单。

与此同时,营销团队正在使用Google Tag Manager (GTM)来管理代码。原则是从页面收集信息,将它们发送到GTM并将这些数据用作变量来生成标签,模板化JS / HTML和这些变量的组合。

问题是这些标签中的大多数都包含javascript,用于向跟踪器,广告服务器或任何合作伙伴发送非常具体的数据。让我们假设我的营销团队意识到安全风险,并且不会包含恶意脚本。

有没有办法知道GTM导入哪些域名,以便它们可以自动添加到我的CSP上?

2 个答案:

答案 0 :(得分:2)

这是一个大问题,我很惊讶关于这方面的信息如此之少。谨防任何建议在您的 CSP 中设置unsafe-inline的解决方案,因为这会使策略变得如此薄弱,几乎毫无用处。

为了回答您的直接问题,无法通过编程方式知道 GTM 使用了哪些域。我建议将 CSP 设置为仅报告模式,并使用错误作为创建白名单的指南。

要回答如何让它们共存的更广泛问题,主要的解决方案是使用 nonce 值和随机数感知 GTM 脚本,如 Google 在此处 https://developers.google.com/tag-manager/web/csp 所述。

简而言之:

  1. 生成一个 nonce 值 - 这需要在每次页面加载时完成才能有效
  2. 将您的 CSP 中的随机数列入白名单
  3. 将其应用于包括 GTM 在内的任何内联脚本
  4. 将 GTM 加载的资源使用的所有主机列入白名单

然而,这个解决方案并不完整,因为 GTM 似乎没有将 nonce 传播到任何自定义 HTML 标签。为此,您必须:

  1. 将 id="gtmScript" 添加到 GTM 代码段的 nonce-aware 版本 - 这将用于定位元素并捕获 nonce
  2. 在 GTM 中,创建一个将捕获随机数的新变量。使用 DOM 元素类型,并选择 GTM 代码段的 ID(本指南中的 gtmScript)
  3. 在 GTM 中,将 nonce 值添加到任何自定义 HTML 脚本
  4. 如果标签不起作用,请使用复选框启用 Support document.write

答案 1 :(得分:1)

我认为没有一种方法可以直接开箱即用。 您可以做的是使用GTM API(https://developers.google.com/tag-manager/api/v1/reference/accounts/containers/tags/list),您可以基本上迭代所有自定义HTML 自定义图像标记并收集主机名