【问题标题】:How to understand the Content-Security-Policy (CSP) rules by the popular websites?如何理解热门网站的 Content-Security-Policy (CSP) 规则?
【发布时间】:2022-01-03 09:30:49
【问题描述】:

最近我在做一些关于 CSP 的研究,我发现一些主流网站对 CSP 的声明很奇怪。

对于 Facebook,登录后,CSP 是这样的:

default-src * data: blob: 'self';
script-src *.facebook.com *.fbcdn.net *.facebook.net *.google-analytics.com *.google.com 127.0.0.1:* 'unsafe-inline' 'unsafe-eval' blob: data: 'self';
style-src data: blob: 'unsafe-inline' *;
connect-src *.facebook.com facebook.com *.fbcdn.net *.facebook.net wss://*.facebook.com:* wss://*.whatsapp.com:* attachment.fbsbx.com ws://localhost:* blob: *.cdninstagram.com 'self';
block-all-mixed-content;
upgrade-insecure-requests;

让我感到困惑的是default-src 使用小行星(*),然后遵循其他更严格的规则('self'):

default-src * data: blob: 'self';

在我最近的研究中,通常不建议使用小行星语法,这会使您的网站不安全。而且我无法弄清楚这条规则的最终效果是什么,如果self总是覆盖*,那为什么要留下多余的*。

至于 Twitter,他们的 CSP 是这样的:

connect-src 'self' blob: https://*.giphy.com https://*.pscp.tv https://*.video.pscp.tv https://*.twimg.com https://api.twitter.com https://api-stream.twitter.com https://ads-api.twitter.com https://aa.twitter.com https://caps.twitter.com https://media.riffsy.com https://pay.twitter.com https://sentry.io https://ton.twitter.com https://twitter.com https://upload.twitter.com https://www.google-analytics.com https://app.link https://api2.branch.io https://bnc.lt wss://*.pscp.tv https://vmap.snappytv.com https://vmapstage.snappytv.com https://vmaprel.snappytv.com https://vmap.grabyo.com https://dhdsnappytv-vh.akamaihd.net https://pdhdsnappytv-vh.akamaihd.net https://mdhdsnappytv-vh.akamaihd.net https://mdhdsnappytv-vh.akamaihd.net https://mpdhdsnappytv-vh.akamaihd.net https://mmdhdsnappytv-vh.akamaihd.net https://mdhdsnappytv-vh.akamaihd.net https://mpdhdsnappytv-vh.akamaihd.net https://mmdhdsnappytv-vh.akamaihd.net https://dwo3ckksxlb0v.cloudfront.net ; 
default-src 'self'; 
form-action 'self' https://twitter.com https://*.twitter.com; 
font-src 'self' https://*.twimg.com; 
frame-src 'self' https://twitter.com https://mobile.twitter.com https://pay.twitter.com https://cards-frame.twitter.com   https://accounts.google.com/; 
img-src 'self' blob: data: https://*.cdn.twitter.com https://ton.twitter.com https://*.twimg.com https://analytics.twitter.com https://cm.g.doubleclick.net https://www.google-analytics.com https://www.periscope.tv https://www.pscp.tv https://media.riffsy.com https://*.giphy.com https://*.pscp.tv https://*.periscope.tv https://prod-periscope-profile.s3-us-west-2.amazonaws.com https://platform-lookaside.fbsbx.com https://scontent.xx.fbcdn.net https://scontent-sea1-1.xx.fbcdn.net https://*.googleusercontent.com https://imgix.revue.co; 
manifest-src 'self'; 
media-src 'self' blob: https://twitter.com https://*.twimg.com https://*.vine.co https://*.pscp.tv https://*.video.pscp.tv https://*.giphy.com https://media.riffsy.com https://dhdsnappytv-vh.akamaihd.net https://pdhdsnappytv-vh.akamaihd.net https://mdhdsnappytv-vh.akamaihd.net https://mdhdsnappytv-vh.akamaihd.net https://mpdhdsnappytv-vh.akamaihd.net https://mmdhdsnappytv-vh.akamaihd.net https://mdhdsnappytv-vh.akamaihd.net https://mpdhdsnappytv-vh.akamaihd.net https://mmdhdsnappytv-vh.akamaihd.net https://dwo3ckksxlb0v.cloudfront.net; 
object-src 'none'; 
script-src 'self' 'unsafe-inline' https://*.twimg.com    https://www.google-analytics.com https://twitter.com https://app.link https://accounts.google.com/gsi/client https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/en_US/appleid.auth.js  'nonce-ODdiNzNlNGYtNjFmNS00ZmYxLWE0ZjctODViNTU5YmI4Zjk5'; 
style-src 'self' 'unsafe-inline' https://accounts.google.com/gsi/style https://*.twimg.com; 
worker-src 'self' blob:; 
report-uri https://twitter.com/i/csp_report?a=O5RXE%3D%3D%3D&ro=false

让我困惑的是script-src:

script-src 'self' 'unsafe-inline' https://*.twimg.com https://www.google-analytics.com https://twitter.com https://app.link https://accounts.google.com/gsi/client https://appleid.cdn-apple.com/appleauth/static/jsapi/appleid/1/en_US/appleid.auth.js  'nonce-ODdiNzNlNGYtNjFmNS00ZmYxLWE0ZjctODViNTU5YmI4Zjk5'; 

我认为nonce 旨在防止unsafe-inline 的使用,但在上述指令中,两者都存在。同样,我的问题是如果后者覆盖前者,为什么要留下多余的unsafe-inline。

【问题讨论】:

  • 对于 Twitter 的问题,Mozilla 的 MDN 说:指定 nonce 会使现代浏览器忽略“unsafe-inline”,在没有 nonce 支持的情况下仍然可以为旧浏览器设置。此外,Google 的 CSP Evaluator 建议“考虑添加‘不安全内联’(被支持随机数/哈希的浏览器忽略)以向后兼容旧版浏览器。”

标签: facebook security twitter http-headers content-security-policy


【解决方案1】:
default-src * data: blob: 'self';

在我最近的研究中,通常不建议使用 asteroid 语法,这会使您的网站不安全。

这通常是可以的,但对于 XSS,script-src 和 connect-src 指令具有它们自己的源白名单,但对 XSS 来说最危险的是没有 *。
对于其余的后备指令,星号* 不是危险源(可能object-src 除外),相反,它是必要的,因为托管图像或媒体内容的第三方主机列表可能无穷无尽。

而且我无法弄清楚这条规则的最终效果是什么,如果'self' 总是覆盖*,那为什么要留下多余的*。

实际上是* 覆盖'self'。是的,'self' 在使用 * 时是多余的。在大公司中,IT 专家不喜欢触及有效的东西。经过一些研究,我认为“自我”只是一种返祖现象,因为一些较旧的 Safari 存在 'self' 的错误。

我以为nonce是为了防止unsafe-inline的使用,但在上面的指令中,两者都存在。

这是为了浏览器向后兼容。
在存在 CSP nonce 的情况下,'unsafe-inline' 将被现代浏览器忽略。不支持 nonce 的旧版浏览器将看到 'unsafe-inline' 并允许执行内联脚本。

【讨论】:

  • 你已经解释的很清楚了。我唯一的问题是为什么* 会覆盖self,所以浏览器向后兼容性 不是由“顺序”决定的?或者,浏览器向后兼容性总是关于hash & nonce。
  • (1) * 表示任何网络方案 (http:/https:/ws:/wss:/ftp:/ftps:) + 任何主机名 + 任何端口号。 'self' 表示浏览器地址栏中的方案 + nost_name + port_number + 一些CSP specific magic。所以* 是一个涵盖所有其他模式的更广泛的模式。
  • (2) 无法按“顺序”决定,因为浏览器实现了 CSP 级别 1/2/3 的功能,而不是按顺序 1/2/3。一些浏览器实现了 CSP3,但尚未完全实现 CSP2 功能。
  • (3) 浏览器的向后兼容性并不总是与“hash”和“nonce”有关,但总的来说,是的,它与“unsafe-inline”+“hash”的组合有关。 “随机数”+strict-dynamic。但是,在向后兼容方面,任何功能都可以用来弥补旧浏览器中某些功能的不足。例如将prefetch-src 指令中的白名单复制到default-src,因为Firefox 尚不支持prefetch-src。
猜你喜欢
  • 2016-11-01
  • 1970-01-01
  • 2017-08-05
  • 2018-03-06
  • 1970-01-01
  • 2021-06-02
  • 1970-01-01
  • 2019-04-17
  • 2021-05-08
相关资源
最近更新 更多