在内容安全-政策(CSP)头的目的是保护你免受恶意资源注入应用程序在你的web应用程序.为简单起见,您可以为所有图像,脚本,样式等提供允许的域来源的白名单.
与此同时,营销团队正在使用Google跟踪代码管理器(GTM)来管理代码.原理是从页面收集信息,将它们发送到GTM并将这些数据用作变量来生成标签,模板化JS/HTML和这些变量的混合.
问题是这些标签中的大多数都包含javascript,用于向跟踪器,广告服务器或任何合作伙伴发送非常具体的数据.让我们假设我的营销团队意识到安全风险,并且不会包含恶意脚本.
有没有办法知道哪些域是由GTM导入的,所以它们可以自动添加到我的CSP上?
javascript security web content-security-policy google-tag-manager
我在服务器的响应中添加了 Content-Security-Policy 标头,但是当 Google 标签管理器 (GTM) 注入自定义 HTML 标签时,浏览器会抛出错误。
CSP3 有“strict-dynamic”,它似乎是为 GTM 定制的,但目前只有 Chrome 支持它,而 CSP3 是一个工作草案。
我编写了代码来通过 GTM API 获取自定义 HTML 标签,希望我可以获取脚本的哈希值并将它们添加到标题中,但我发现 API 提供的 JavaScript 与 GTM 注入到 DOM 中的内容不匹配,因为 GTM 在注入脚本之前会缩小/混淆脚本。
现在我想知道是否有可能,只是可能,有一种方法可以告诉 GTM 向它注入的每个脚本添加一个随机数,但我找不到任何文档来支持这种希望/幻想。
有没有人遇到过这个问题,并找到了解决这个问题的方法?
(我不能像这里提到的那样从脚本中提取主机 -如何让 Google 标签管理器和内容安全策略共存? - 因为我们营销团队添加的自定义 HTML 标签是带有非空主体的标签,而不是只是带有源属性的标签,没有正文。)
我想向动态构造的脚本标记添加一个随机数。下面的代码不会向生成的脚本标签添加任何随机数。有人知道如何添加随机数吗?
var _wss = document.createElement('script');
_wss.nonce = 'random-string';
_wss.type = 'text/javascript';
_wss.charset = 'utf-8';
_wss.async = true;
_wss.src = "url";
var __wss = document.getElementsByTagName('script')[0];
__wss.parentNode.insertBefore(_wss, __wss);
Run Code Online (Sandbox Code Playgroud)
结果是:
<script type="text/javascript" charset="utf-8" async src="url"></script>
Run Code Online (Sandbox Code Playgroud)
预期结果:
<script nonce="random-string" type="text/javascript" charset="utf-8" async src="url"></script>
Run Code Online (Sandbox Code Playgroud)
谢谢!