内容安全策略可以与Google Analytics和AdSense兼容吗

Can Content Security Policy be made compatible with Google Analytics and AdSense?

本文关键字:AdSense Analytics 安全策略 Google      更新时间:2023-09-26

有人知道如何让CSP(即使使用默认的src通配符)发挥作用吗?这样,现代分析脚本就会将网站每页的数据(而不仅仅是主页数据)发送到网站所有者的帐户,从而出现AdSense广告?

我为我的网站尝试了许多CSP的变体,包括<H5BP.com>'.htaccess文件,但所有这些都阻止了Google Analytics生成每页数据(主页除外)和Google AdSense接受任何页面上的广告。

谷歌的机器没有看到Analytics脚本,尽管谷歌的人总是在我的网站源代码中看到它。甚至将CSP默认src设置为星号通配符也失败了。

在谷歌论坛和非谷歌论坛上询问没有任何效果,只是人们说问题出在我的CSP上,我收到了一封电子邮件,说我应该完全评论CSP。最后成功了。注释掉应该不会比默认的src通配符更好,但注释掉是我获得广告和网站内部数据的唯一方式。

  • 大约一个月前,我在谷歌上发布了关于不兼容的帖子,但没有人反驳(https://www.en.advertisercommunity.com/t5/Code-Implementation/content-security-policy-and-Analytics-and-likely-AdSense/m-p/491031)。

  • 堆栈溢出在<谷歌分析和内容安全策略标题>不要表明任何人正在获取网站分析数据,并且该线程基于过时的谷歌脚本。

  • <Google analytics.js和内容安全策略>是一个应用程序,而不是一个网站,没有人报告获得了网站内的分析数据,即使使用了最宽松的CSP,我的努力也失败了。

  • 解决方案在线程<谷歌分析通用代码未跟踪>但解决方案仅限于将CSP设置为报告,而不是阻止,这对我没有多大用处。

无堆栈溢出线程是关于CSP和AdSense的。当我建议H5BP在他们的模型中告诉用户这一点时<。htaccess>,他们的受访者说这对他有效,并把我介绍给你。

作为对建议的检查,是否有人在自己的Google Analytics帐户中看到该页面特定的数据,并在运行.htaccess CSP时看到AdSense广告?

编号。截至今日【9月16日8日】。我们禁用了CSP,因为谷歌帧源是特定于域的->帧src:…Google.co.uk Google.co.fr…

Adsense

对于谷歌广告,例如这个CSP"工作":

Content-Security-Policy: frame-ancestors 'self';

它可以在不限制页面功能的情况下防止页面被框住。因此,它的XSS保护是不存在的。

但是Adsense脚本可以加载一些加载的东西,然后加载等等。考虑到他们可以使用数千个(在撰写本文时:3103)第三方广告网络,我们根本没有合理可行的方法来知道他们所有人都需要什么才能使广告发挥作用。因此,如果你想拥有Adsense,那么限制图像、flash、javascript等的加载位置是不可能的。

一个或另一个:

  • Adsense
  • 限制性CSP

但不是两者都有。

分析

是另一个问题,其他答复中已经涉及。[不是用户]

CSP政策

需要提醒许可CSP策略的潜在作者,例如https:*不包括对unsafe-inlinedata:源的权限。我在网上看到过很多地方,作者们认为他们是这样做的

在制定政策时,最好先写一份报告。标头的名称为"Content Security Policy Report Only",而不是"Content Security Policy",它不会停止任何操作,只需在json中向指定的目标执行报告部分即可。请参见此处:https://developers.google.com/web/fundamentals/security/csp/#report-仅

或使用报告uri记录所有错误,以便将源添加到CSP中。

JSON将POST到该URL(https://example.com/csp/log.php)。

Content-Security-Policy: default-src 'self';
report-uri: https://example.com/csp/log.php;

有了严格的CSP 3和nonces,我认为这是可能的,但我没有能力进行测试,因为我们没有使用AdSense。

1.)将所有javascript放在.js文件中(GA、AdSense等)。没有内联JS。

2.)使用建议的"严格"CSP:https://csp.withgoogle.com/docs/strict-csp.html

3.)像通常包含任何文件一样包含.js文件,但添加一个nonce:

<script src="/mygooganalytics.js" nonce="[your nonce here]"></script>

效果应该是允许任何源自mygooganalytics.js的内容。nonce通常由服务器端代码(php、ruby等)创建,但如果这是在你的应用程序之外/在一个普通的旧html文件中,你可以使用服务器生成一个nonce。如果您碰巧使用Apache:使用Apache 2.4生成一个nonce(用于内容安全策略标头)

使用以下代码对我有效:

default-src 'self' googleads.g.doubleclick.net;
script-src 'self' 'unsafe-inline' data: pagead2.googlesyndication.com storage.googleapis.com googleads.g.doubleclick.net ajax.googleapis.com; 
img-src 'self' data: storage.googleapis.com pagead2.googlesyndication.com; 
style-src 'self' 'unsafe-inline'; 
font-src 'self' fonts.googleapis.com; frame-ancestors 'self'; object-src 'self'