我有一个使用默认html5boilerplate内容安全策略的Web应用程序.
但是,我们在页面上有新的Google analytics.js代码段,该代码段已被CSP阻止.
我一直试图找到一个CSP和JS包含结构的例子,它将允许谷歌analytics.js,但没有任何运气.
最接近的SO帖子是Google Analytics和Content-Security-Policy标头,但这是使用较旧的ga.js.
不幸的是,Google Docs没有提到CSP.
我已经达到了以下解决方案:
我的html文件的底部:
<script type="text/javascript" src="/js/analytics.js"></script>
Run Code Online (Sandbox Code Playgroud)
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');
Run Code Online (Sandbox Code Playgroud)
.htaccess CSP:
Header set Content-Security-Policy "script-src 'self' https://ssl.google-analytics.com http://www.google-analytics.com; object-src 'self'"
Run Code Online (Sandbox Code Playgroud)
这是有效的 - 但我不确定我是否会打破GA代码的异步性质,或者造成一些其他意想不到的后果.
有人可以建议通过内容安全策略允许Google analytics.js的正确方法吗?
作者编辑: 最后,我使用了Google Analytics和Content-Security-Policy标题中详细介绍的解决方案,还原为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>
Run Code Online (Sandbox Code Playgroud)
analytics.js的内容:
ga('create', 'UA-XXXX-Y', 'auto');
ga('send', 'pageview');
Run Code Online (Sandbox Code Playgroud)
CSP:
Header set Content-Security-Policy "script-src 'self' https://www.google-analytics.com https://ssl.google-analytics.com; object-src 'self'"
Run Code Online (Sandbox Code Playgroud)
这是未经测试的 - …
Content-Security-Policy HTTP标头用于阻止来自不受信任服务器的内联脚本和资源.但是,Google Analytics代码段示例依赖于这两者.这方面的最佳做法是什么?
这是我目前使用的Content-Security-Policy标头:
default-src 'self'; script-src 'self' https://ssl.google-analytics.com; img-src 'self' http://www.google-analytics.com/__utm.gif https://ssl.google-analytics.com/__utm.gif;
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经完成了以下工作:
我在我的html中添加了两个脚本标签:
<script src="/js/google-analytics.js"></script>
<script src="https://ssl.google-analytics.com/ga.js" async="true"></script>
Run Code Online (Sandbox Code Playgroud)
google-analytics.js使用_setAccount和_trackPageview设置_gaq数组.
我将ga.js的域添加到了script-src中.
我注意到ga.js正在加载两个图像,所以我将它们添加到img-src中.
有什么我想念的吗?Google会改变我的想法并打破这一切吗?有官方推荐吗?
我们正在努力创建一个严格的内容安全策略 ( https://csp.withgoogle.com/docs/strict-csp.html ),它要求 Apache 在每次请求资源时创建一个随机数,以便我们可以插入这个随机数进入http标头。
我们如何使用 Apache 2.4 创建随机数?
我读过的所有 CSP 相关文档都说“随机数只是在服务器上生成的一个随机字符串,包含在 CSP 标头中......”但没有找到任何关于如何做的信息这与阿帕奇。我们当然可以用应用程序代码来做到这一点,但通过 Apache 做到这一点似乎是一个更简洁的解决方案/将确保每个页面都获得 CSP 标头。
我开发了一个网站,我想在网站上添加谷歌的adsense.我创建了一个adsense帐户,并将代码段添加到我的网站.但Google的addsbygoogle.js会加载并编写一些浏览器拒绝加载的内联脚本和样式,因为它违反了我的CSP规则.
我已经尝试将nonce的'strict-dynamic'添加到页面中的所有脚本中,但仍拒绝加载这些脚本.
如果我添加"unsalfe-inline",它一切正常,但有更安全的方法来做到这一点.
谢谢
我尝试将随机数添加到中SCRIPT_SRC,但是CSP抱怨adsbygoogle.js:拒绝执行内联事件处理程序,因为它违反了以下内容安全政策指令:
"script-src 'self' *.facebook.net *.facebook.com www.google.com www.gstatic.com
google.com www.google-analytics.com adservice.google.com adservice.google.de
pagead2.googlesyndication.com www.pagead2.googlesyndication.com
https://pagead2.googlesyndication.com storage.googleapis.com
googleads.g.doubleclick.net ajax.googleapis.com 'nonce-5MallQacNWY+qLLMd5hwAGRaJXReVK7U'".
(anonymous) @ adsbygoogle.js:2887
Run Code Online (Sandbox Code Playgroud)
它抱怨第2887行(我未缩小adsbygoogle.js来查看csp抱怨的行)。
我假设添加随机数将允许应用javascript文件中的任何内容(除外)unsafe-inline。
还有另一种方法可以让Google Adsense与CSP一起玩或者添加“不安全内联”是唯一的选择吗?
根据这个stackoverflow答案/sf/answers/3140704731/,它不能与CSP一起正常工作。