【发布时间】:2015-09-05 12:50:34
【问题描述】:
我有一个使用默认 html5boilerplate 内容安全策略的 Web 应用程序。
但是,我们在页面上有新的 Google analytics.js sn-p,它被 CSP 阻止了。
我一直试图找到一个 CSP 和 JS 包含结构的示例,该结构将允许 Google analytics.js,但没有任何运气。
最近的 SO 帖子是 Google Analytics and Content-Security-Policy header,但这是使用较旧的 ga.js。
很遗憾,Google Docs 没有提到 CSP。
我已经达到了以下解决方案:
我的 html 文件的底部:
<script type="text/javascript" src="/js/analytics.js"></script>
analytics.js 的内容:
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function()
{ (i[r].q=i[r].q||[]).push(arguments)}
,i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g; m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-XXXXXXXX-1', 'auto');
ga('send', 'pageview');
.htaccess CSP:
Header set Content-Security-Policy "script-src 'self' https://ssl.google-analytics.com http://www.google-analytics.com; object-src 'self'"
这行得通 - 但我不确定我是否会破坏 GA 代码的异步性质,或导致其他一些意想不到的后果。
有人可以建议通过内容安全策略允许 Google analytics.js 的正确方法吗?
作者编辑: 最后我使用了Google Analytics and Content-Security-Policy header 中详述的解决方案,恢复到 ga.js。但我仍然想知道是否可以以同样的方式使用 analytics.js。
作者编辑 2: 看起来可以直接使用来自 Google 的 analytics.js 以及与其他 SO 帖子相同的原则:
HTML 文件底部:
<script type="text/javascript" src="https://ssl.google-analytics.com/analytics.js"></script>
<script type="text/javascript" src="/js/analytics.js"></script>
analytics.js 的内容:
ga('create', 'UA-XXXX-Y', 'auto');
ga('send', 'pageview');
CSP:
Header set Content-Security-Policy "script-src 'self' https://www.google-analytics.com https://ssl.google-analytics.com; object-src 'self'"
这是未经测试的 - 我没有检查 Google 分析是否正在接收数据,但没有控制台或 CSP 错误。手指交叉。
【问题讨论】:
-
虽然我不能,从我的头顶,可以评论 CSP 我很确定在 HTML 文件的底部加载 GA 引导代码将使异步加载毫无意义因为它只在 DOM 加载后才开始。
-
我遇到了同样的问题,希望您能确认此解决方案仍然有效,或者发布您最终使用的解决方案?
-
还有必要接受ssl.google-analytics.com吗? Analytics.js 似乎只使用 www 子域。对这种设置使用替代的 async sn-p 会更好,并为两个标签添加“async”属性。 developers.google.com/analytics/devguides/collection/…
标签: javascript google-analytics content-security-policy