Google Adwords CSP(内容安全策略)img-src

Google Adwords CSP (content security policy) img-src

Content-Security-Policy header 的 img-src 指令中的哪些 domains/protocols 需要允许 Google AdWords 转换跟踪?

根据测试,当我们调用 google_trackConversion 时,浏览器似乎创建了一个带有 src 的图像,该图像遵循不同域之间的 302 重定向链...

www.googleadservices.com ->
googleads.g.doubleclick.net ->
www.google.com ->
www.google.co.uk

最后的 .co.uk 在我看来很可疑。当我们从英国进行测试时,我们担心从其他国家/地区调用的跟踪会重定向到其他域。

我们需要打开哪些域的完整列表才能使跟踪正常工作?


根据评论中的要求,第一个请求的示例路径组件是:

pagead/conversion/979383382/?random=1452934690748&cv=8&fst=1452934690748&num=1&fmt=3&label=jvoMCNP4umIQ1uiA0wM&guid=ON&u_h=1080&u_w=1920&u_ah=1033&u_aw=1920&u_cd=24&u_his=18&u_tz=0&u_java=false&u_nplug=5&u_nmime=7&frm=0&url=https%3A//beta.captevate.com/payment%3Flevel%3Da00&async=1

再次重复转换,第一次请求的路径部分为

pagead/conversion/979383382/?random=1452934959209&cv=8&fst=1452934959209&num=1&fmt=3&label=jvoMCNP4umIQ1uiA0wM&guid=ON&u_h=1080&u_w=1920&u_ah=1033&u_aw=1920&u_cd=24&u_his=26&u_tz=0&u_java=false&u_nplug=5&u_nmime=7&frm=0&url=https%3A//beta.captevate.com/payment%3Flevel%3Da00&async=1

我使用免费的 VPN 服务从几个国家(荷兰和新加坡)进行连接,最后一次重定向没有发生:www.google.com 的最终请求是 200。但是,我显然还没有尝试从 每个 国家/地区连接,所以我原来的问题成立。

您可以使用维基百科的 List of Google domains。有许多域与 Google Adwords 无关,但我认为允许 youtube.com 这样的域不会导致问题。

当前列表是:

google.com
google.ac
google.ad
google.ae
google.com.af
google.com.ag
google.com.ai
google.al
google.am
google.co.ao
google.com.ar
google.as
google.at
google.com.au
google.az
google.ba
google.com.bd
google.be
google.bf
google.bg
google.com.bh
google.bi
google.bj
google.com.bn
google.com.bo
google.com.br
google.bs
google.bt
google.co.bw
google.by
google.com.bz
google.ca
google.com.kh
google.cc
google.cd
google.cf
google.cat
google.cg
google.ch
google.ci
google.co.ck
google.cl
google.cm
google.cn
g.cn
google.com.co
google.co.cr
google.com.cu
google.cv
google.com.cy
google.cz
google.de
google.dj
google.dk
google.dm
google.com.do
google.dz
google.com.ec
google.ee
google.com.eg
google.es
google.com.et
google.fi
google.com.fj
google.fm
google.fr
google.ga
google.ge
google.gf
google.gg
google.com.gh
google.com.gi
google.gl
google.gm
google.gp
google.gr
google.com.gt
google.gy
google.com.hk
google.hn
google.hr
google.ht
google.hu
google.co.id
google.iq
google.ie
google.co.il
google.im
google.co.in
google.io
google.is
google.it
google.je
google.com.jm
google.jo
google.co.jp
google.co.ke
google.ki
google.kg
google.co.kr
google.com.kw
google.kz
google.la
google.com.lb
google.com.lc
google.li
google.lk
google.co.ls
google.lt
google.lu
google.lv
google.com.ly
google.co.ma
google.md
google.me
google.mg
google.mk
google.ml
google.com.mm
google.mn
google.ms
google.com.mt
google.mu
google.mv
google.mw
google.com.mx
google.com.my
google.co.mz
google.com.na
google.ne
google.com.nf
google.com.ng
google.com.ni
google.nl
google.no
google.com.np
google.nr
google.nu
google.co.nz
google.com.om
google.com.pk
google.com.pa
google.com.pe
google.com.ph
google.pl
google.com.pg
google.pn
google.co.pn
google.com.pr
google.ps
google.pt
google.com.py
google.com.qa
google.ro
google.rs
google.ru
google.rw
google.com.sa
google.com.sb
google.sc
google.se
google.com.sg
google.sh
google.si
google.sk
google.com.sl
google.sn
google.sm
google.so
google.st
google.sr
google.com.sv
google.td
google.tg
google.co.th
google.com.tj
google.tk
google.tl
google.tm
google.to
google.tn
google.com.tr
google.tt
google.com.tw
google.co.tz
google.com.ua
google.co.ug
google.co.uk
google.com
google.com.uy
google.co.uz
google.com.vc
google.co.ve
google.vg
google.co.vi
google.com.vn
google.vu
google.ws
google.co.za
google.co.zm
google.co.zw
admob.com
adsense.com
adwords.com
android.com
blogger.com
blogspot.com
chromium.org
chrome.com
chromebook.com
cobrasearch.com
googlemember.com
googlemembers.com
com.google
feedburner.com
doubleclick.com
igoogle.com
foofle.com
froogle.com
googleanalytics.com
google-analytics.com
googlecode.com
googlesource.com
googledrive.com
googlearth.com
googleearth.com
googlemaps.com
googlepagecreator.com
googlescholar.com
gmail.com
googlemail.com
keyhole.com
madewithcode.com
panoramio.com
picasa.com
sketchup.com
urchin.com
waze.com
youtube.com
youtu.be
yt.be
ytimg.com
youtubeeducation.com
youtube-nocookie.com
like.com
google.org
google.net
466453.com
gooogle.com
gogle.com
ggoogle.com
gogole.com
goolge.com
googel.com
duck.com
googlee.com
googil.com
googlr.com
googl.com
gmodules.com
googleadservices.com
googleapps.com
googleapis.com
goo.gl
googlebot.com
googlecommerce.com
googlesyndication.com
g.co
whatbrowser.org
localhost.com
withgoogle.com
ggpht.com
youtubegaming.com

但是,如果您想确定这是否真的是所有域,您应该直接询问 Google。

不幸的是,解决这个问题的方法并不多。当 CSP 处于活动状态时,资源需要白名单(在远程资源的情况下,就像这个)或内联技巧(即 noncesha256-...)。不过,归根结底,CSP 可能仍然可以使您的站点更安全并保护大部分资源。

不过,根据您的尝试,您仍然可以实现目标。

这里有一些选项:

  1. 将所有图像列入白名单。

    当然,您可以简单地在 img-src 指令中放置一个 "*",但我想您已经知道这一点并且选择不这样做,因为它破坏了 CSP 对图像的保护。

  2. 通过其他方式加载图像。

    如果您只想锁定图像,并且不太关心 XMLHttpRequest,您可以通过 POST 或什至通过 <script> 标签与自定义 type(使用 AdWords image tag 跟踪方法)。这利用了这样一个事实,即 Google 只需要浏览器完成 HTTP request/response(和重定向)循环以进行分析,而您并不真正关心解析或执行结果内容,这反正是一个 1x1 的透明像素。这允许您锁定 img-src 指令(如果这确实是您的目标),同时仍然允许 Google 想要用于重定向的任何域。

    我知道这只会解决您的问题,但如果您的主要威胁是恶意图像,它会很有用。

  3. 将所有 Google 域放入您的 img-src

    如下所示。 Header 长度 成为一个问题(即使规范说你没问题,实施者并不总是那么慷慨),更重要的是,你可能会遇到虚假故障 Google 更改了他们的域列表,这当然不是 public 或容易引起注意的操作(除了您的广告转化没有通过!)。因为我想你的工作不是不断更新那个列表,你可能不想使用这个选项。

  4. 报告失败几个月,然后继续努力。

    因为 CSP 支持报告 URI 和 Content-Security-Policy-Report-Only 变体,您可以在 report-only 模式下推出它并等待报告进来。如果您已经有关于您的用户群的良好数据(并且它变化不大),这可能是一个不错的选择 - 一旦您看到这些报告稳定在域列表中,将其密封在常规 CSP header 中。或者,您可以在最终的 header 上放置一个报告 URI 以捕获任何其他故障。当然,这种策略的缺点是您在 report-only 模式下得不到保护,当您切换到强制执行它时,失败会导致转换数据丢失,您正在追赶。

  5. 带反向代理的静态像素

    好的。好吧,由于上述选项不是那么好(我承认),是时候跳出框框思考了。这里的问题是 Google(sharding/geo-pinning 域)应用的 HTTP 优化技术与良好的安全实践(即 CSP)不一致。域名歧义的根本原因是客户端的地理位置,那为什么不自己pin呢?

假设您对自己的 HTTP 服务器有高级控制,您可以使用静态像素方法自己跟踪和代理请求,如下所示:

User ---> GET http://your-page/

User <--- <html>...
          pixel: http://your-page/pixel?some=params

User ---> http://your-page/pixel?some=params
          ---> fetch http://googleads.g.doubleclick.net/pagead/viewthroughconversion/12345/?some=params
          <--- redirect to http://google.com, or http://google.co.uk
User <--- return redirect

使用 static pixel(如方法 #2)并将您的代理放在美国或英国应该确保源 IP 在地理上固定在那里,并且 Google 的任播前端应该将您路由到一个稳定的端点。在用户和 Google 之间放置代理也可以让您有机会 force-rewrite 重定向,如果您愿意的话。

为了简化代理设置(并增加一些性能香料),您可以选择 Fastly with Origin Shielding 之类的东西,而不是自己构建它。如果从那里添加 DoubleClick 后端和代理,则可以将来自 CDN 的原始请求固定为仅来自特定地理区域。无论哪种方式,您的用户都应该看到一组稳定的重定向,并且您可以 trim 将 Google 域列表缩小到 img-src 'self' *.google.com *.doubleclick.net *.googleadservices.net.

编辑: 同样值得注意的是,Fastly(和 growing list of other CDN providers) peer directly with Google Cloud 在他们的一些 Points-of-Presence 中,提供了一个优化的路径进入 Google 的代理网络。

你想通过锁定 img-src 来达到什么目的?

CSP 是一个很好的安全选项,但大多数问题与 javascript(可能导致各种问题)、css(可用于隐藏或覆盖注入内容的元素)有关或框架选项(可通过类似的覆盖内容用于 click-jacking)。恕我直言,图像的风险要小得多。

我能想到的加载图像的安全风险很少,归结为:

  1. 跟踪及其对隐私的影响。虽然您已经在使用 Google Adwords,但它的跟踪率很高。那些关心这个的人通常会在他们的浏览器中阻止它。

  2. 加载不安全的内容(我假设您只使用 HTTPS 或整个对话有点毫无意义?)。这可以通过针对 img-src.

  3. 的仅 https 的更宽松的 CSP 策略来解决
  4. 加载图像并随后用该流氓图像覆盖您网站的一部分。但这也需要 javascript and/or CSS 注入——这应该在 CSP 中被锁定。

最终,除非您有 XSS 漏洞,否则人们应该无法轻松地将图像加载到您的页面中。即使他们可以,我认为风险很小。

所以,我很想只做一个 "img-src 'self' https:;" 而不是尝试其他人建议的任何其他解决方法 - 所有这些都有缺点并且不是很适合未来。

最后,如果您担心您网站的安全,锁定图像是一个高优先级,我会质疑您是否应该 运行 Google Adwords.

但是,如果您尝试防范特定威胁,同时仍允许 Adwords,请提供相关详细信息,并且可能还有其他解决方法它。目前,您已要求针对特定问题的解决方案,但不一定解释实际的潜在问题,这些问题可能有与您所询问的解决方案不同的解决方案。