Google Adwords CSP (content security policy) img-src

前端 未结 3 562
暖寄归人
暖寄归人 2020-12-05 06:45

What domains/protocols in the img-src directive of the Content-Security-Policy header are required to allow Google AdWords conversion tracking?

From te

相关标签:
3条回答
  • 2020-12-05 07:12

    Unfortunately, there aren't many ways around this. Resources require either whitelisting (in the case of remote resources, like this one) or inlining tricks (i.e. nonce or sha256-...) when CSP is active. At the end of the day, though, CSP can probably still make your site safer and protect most resources.

    Depending on what you are trying to do, though, you may still be able to achieve your goal.

    Here are some options:

    1. Whitelist all images.

      Of course, you could simply place a "*" in your img-src directive, but I imagine you already know that and are choosing not to because it defeats CSP's protection for images.

    2. Load the image via alternate means.

      If all you are after is specifically locking down images, and, say, don't care so much about XMLHttpRequest, you could load the pixel via POST or even via a <script> tag with a custom type (using the AdWords image tag tracking method). This takes advantage of the fact that Google only needs the browser to complete the HTTP request/response (and redirect) cycle for analytics purposes, and you don't really care about parsing or executing the resulting content, which is a 1x1 transparent pixel anyways. This allows you to lock down your img-src directive (if that is indeed your goal) while still allowing whatever domain Google would like to use for redirects.

      I know this only moves your problem, but it's useful if your main threat is malicious images.

    3. Place all Google domains in your img-src.

      As suggested below. Header lengths will be a problem (even if the specs say you're fine, implementors are not always so generous), and more importantly, you may encounter spurious failures as Google changes their list of domains, which is certainly not a public or easily noticeable action (besides your ad conversions not coming through!). Since I imagine your job isn't to update that list constantly, you probably don't want to go with this option.

    4. Report failures for a few months and then roll with it.

      Because CSP supports reporting URIs and the Content-Security-Policy-Report-Only variant, you can roll it out in report-only mode and wait for reports to come in. If you already have good data about your userbase (and it doesn't change much), this can be a good option - once you see those reports stabilize on a list of domains, seal it in a regular CSP header. Optionally, you can place a reporting URI on the final header to catch any additional failures. The downside of this strategy, of course, is that you don't get protection while in report-only mode, and when you switch to enforcing it, failures cause lost conversion data and you're playing catch up.

    5. Static pixel with reverse proxy

      Okay. Well, with the above options not being so great (I admit it), it's time to think outside the box. The problem here is that HTTP optimization techniques applied by Google (sharding/geo-pinning domains) are at odds with good security practice (i.e. CSP). The root cause of the domain ambiguity is the client's geographic location, so why not pin it yourself?

    Assuming you have advanced control of your own HTTP server, you could use the static pixel approach for tracking and proxy the request yourself, like so:

    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
    

    Using a static pixel (like approach #2) and putting your proxy, say, in the US or UK should ensure that the source IP is geographically pinned there, and Google's anycast frontend should route you to a stable endpoint. Placing a proxy in between the user and Google also gives you a chance to force-rewrite the redirect if you want to.

    To simplify proxy setup (and add some performance spice), you could opt for something like Fastly with Origin Shielding instead of building it yourself. If you add the DoubleClick backend and proxy from there, you can pin the originating requests from the CDN to come only from a certain geographic region. Either way, your user should see a stable set of redirects, and you can trim down that list of Google domains to just img-src 'self' *.google.com *.doubleclick.net *.googleadservices.net.

    Edit: It is also worth noting that Fastly (and a growing list of other CDN providers) peer directly with Google Cloud at a few of their Points-of-Presence, offering an optimized path into Google's networks for your proxied traffic.

    0 讨论(0)
  • 2020-12-05 07:16

    What are you trying to achieve by locking down your img-src?

    CSP is a great security option but most issues are with javascript (which can cause all sorts of issues), css (which can be used to hide or overly elements with injected content) or framing options (which can be used for click-jacking by similarly overlying content). Images are a much smaller risk IMHO.

    There are few security risks that I can think of with loading images, which boil down to:

    1. Tracking and the privacy implications of that. Though you are already using Google Adwords which tracks so much. And those that care about this typically block it in their browser.

    2. Loading of insecure content (I presume you are using HTTPS exclusively or this whole conversation is a bit pointless?). This can be remediated with a more loose CSP policy of just https for img-src.

    3. Loading an image and subsequently overlying part of your website with that rogue image. But that requires javascript and/or CSS injection too - which should be locked down in CSP.

    Ultimately unless you have a XSS vulnerability people shouldn't be able to easily load images into your pages. And even if they could I think the risks are small.

    So, I would be tempted to just have a "img-src 'self' https:;" rather than try any of the other work arounds the others have suggested - all of which have downsides and are not very future proof.

    Ultimately if you are that concerned about security of your site that locking down images is a high priority I would question whether you should be running Google Adwords.

    However if there is a specific threat you are trying to protect against, while at the same time still allowing Adwords, then provide details of that and there may be other ways around it. At the moment you've asked for a solution to particular problem without necessarily explaining the actual underlying problem which may have solutions other than the one you are asking about.

    0 讨论(0)
  • 2020-12-05 07:34

    You can use Wikipedia's List of Google domains. There are many domains unrelated to Google Adwords, but I don't think allowing domains like youtube.com could cause problems.

    Currently the list is:

    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
    

    However, if you want to be sure if that's really all domains, you should ask Google directly.

    0 讨论(0)
提交回复
热议问题