localhost/:12 Cross-Origin Read Blocking (CORB) blocked cross-origin response https://c.y.qq.com/v8/

关于CORB解决报错原因:

localhost/:12 Cross-Origin Read Blocking (CORB) blocked cross-origin response https://c.y.qq.com/v8/fcg-bin/v8.fcg?g_tk=976692372&inCharset=utf-8&outCharset=utf-8&notice=0&format=json&channel=singer&page=list&key=all_all_all&pagesize=100&pagenum=1&hostUin=0&needNewCode=0&platform=yqq with MIME type text/html. See https://www.chromestatus.com/feature/5629709824032768 for more details.

1.什么是CORB(Cross-Origin Read Blocking)

CORB(Cross-Origin Read Blocking)是一种判断是否要在跨站资源数据到达页面之前阻断其到达当前站点进程中的算法,降低了敏感数据暴露的风险。

2.Chrome 浏览器行为

CORB 启动时,虽然响应结果会被置空,但是请求的服务仍然成功,`status: 200`。比如:使用 `img` 标签上报页面监控数据,尽管响应结果为空,但请求依旧发送成功,服务器亦正常响应。

3.为什么会有 CORB

简单来说,就是出现了一些网络安全漏洞,为防止漏洞肆虐,便出现了站点隔离(Site Isolation),CORB 则是其中的一种实现策略。

4.幽灵和熔断漏洞(Spectre & Meltdown)

这个漏洞是在今年 1 月份被报道出来的,是硬件系统层面的漏洞。关于这个漏洞本身,网上已经有专业的论文对其进行了详尽的介绍,有兴趣可以自行搜索阅读,这里就不展开说了。简单讲,就是结合上文提及的两个概念的两种实际攻击方法。

这里还需要再说一下 CPU 读取数据的方式,CPU 除了利用预执行来提供性能,它本身在从内存读取数据的时候,还会涉及一个缓存的概念。从缓存读取数据的速度是大于内存的,当 CPU 发现将要读取的一个数据在缓存中存在时,它会直接从缓存中读取,这样同样可以提高性能,但是缓存很小同时也很昂贵,所以缓存的大小无法与内存相比。同时,每个程序运行时,CPU 为了防止进程间互相保持独立,它们都拥有属于自己的某块内存区域,假设程序 A 存在一条想要直接越界访问程序 B 内存的指令,这在 CPU 是属于非法的,它不会执行这条指令,而会选择抛出异常并终止程序,然后将其相应的内存数据清零。

之后问题就出现了,假设我们有以下代码:

if (x < arr1.length) {
  y = arr2[arr1[x]]
}

这里大概解释一下:

  • arr1 假设是一个比较小的数组,x 是一个我们定义的索引值变量
  • 正常情况下,如果 x 超过 arr1 的长度,程序是要崩溃的,因为它越界了,但是在预执行的前提下,CPU 可能会忽略越界的问题而执行 if 语句内部的代码
  • arr2 是我们提前声明的一个用来储存数据的数组,它储存于内存的另一个区域,它是连续的,而且我们强制它没有拷贝至缓存,只保存于内存(这点在视频中有提及,我这里强调一下)
  • 之后我们假设 arr1 中的位于 x 索引出的值是 k,那么在预执行的前提下,y = arr2[arr1[x]]等价于y = arr2[k]
  • 然后由于我们会把 arr2[k] 这个值付给另一个变量 y,这里其实算是一个访问值的操作,CPU 后将 arr2[k] 位于内存地址的值转入缓存中,而其余元素保留在内存中(因为并未访问)

之后,只需要遍历 arr2 这个数组,当发现某个索引上的值的访问速度远快于其他索引的访问速度时,这个索引既是我们从越界内存中“偷”到的值。至此,一次攻击就完成了,理论上,利用这个漏洞,可以获取缓存区所有地址的值,其中很有可能包含敏感信息,比如密码什么的。

5.详细介绍CORB(Cross-Origin Read Blocking)

这里可能有人会问,这和上面说的一堆又有什么关系呢?是这样的,Chrome浏览器在处理不同 tab 和不同页面时,会将为它们划分不同的进程,而且受制于同源策略的影响,这些页面之间本应该互不干扰。但是我们知道,同源策略虽然牛逼,但浏览器中仍然存在一些不受制于它约束的 api、标签,比如常见的 img、iframe 和 script等等。诸如以下代码,不知道看文章的诸位有没有写过,或者说遇见过:

<img src="https://foo/bar/baz/">

那肯定有人又会问,一个 img 标签你 src 属性不填图片的 uri,你是不是傻。其实不是这样的,有时候对网站做一些跟踪和分析时,确实会这么写,因为浏览器会往https://foo/bar/baz/这个地址发送一个 GET 资源的请求,在服务端我们可以利用这个请求做一些追踪的逻辑,同理 script 也可以完成需求。但是这么做的后果就是,虽然 img 帮我们发送了这个请求,但是它却没有得到所期望格式的资源,所以这里实际可以算作一种错误或者异常。而一些攻击者可以利用这一点,比如,在页面嵌入下面的代码:

<img src="https://example.com/secret.json">

来加载跨域私密文件,因为 img 不受同源策略的制约,这个请求是可以发出去的,服务器响应返回后,显然 secret.json 不是一个图片格式的资源,img 不会显示它,但是并不代表负责渲染当前页面的进程的内存中没有保留关于 secret.json 的数据。因此攻击者可以利用上文中提及的漏洞,编写一些代码来“偷”这些数据,从而造成安全隐患。

而 CORB 的作用就是当浏览器尝试以上面代码的方式加载跨域资源时,在资源未被加载之前进行拦截,从而提升攻击者进行幽灵攻击的成本,这里之所以是说提升成本还非彻底解决是因为这个漏洞是基于硬件层面的,所以软件层面只能做有限的修复,有的人可能马上会说,那 CPU 直接去掉或者用户放弃使用预处理功能不就好了吗?理论上是这样的,但是这将导致预处理带来的性能红利瞬间消失,而且 CPU 的架构设计也不是一天两天就能改的,而且就算改了也没办法一下普及。

6.哪些内容类型受 CORB 保护

当前有三种内容类型受保护,分别是 json、html 和 xml。关于如何针对每种内容类型 CORB 如何对其进行保护,文档中有详细的章节进行介绍,这里就不多说了。我浏览了一遍,大体的规则均是对内容格式进行一些有针对性的校验,以确认它确实是某个内容类型。这个校验结果最终影响 CORB 的运作方式。

7.如何解决上面的CORB报错

可以使用后端代理的方式进行处理:

  • 在后端使用http请求库对相应的资源进行请求,此时要设置请求头的reffer和host属性为请求的资源的URI
    # 定义一个请求头
    headers = {
        "user-agent": "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Mobile Safari/537.36",
        "referer": "https://c.y.qq.com",
        "host": "c.y.qq.com"
    }
  • 然后在视图函数中请求资源
    def getSingerList(request):
        url = "https://c.y.qq.com/v8/fcg-bin/v8.fcg?g_tk=976692372&inCharset=utf-等等"
        res = requests.get(url, params=None, headers=headers)
        return JsonResponse(json.loads(res.text), safe=False,json_dumps_params={'ensure_ascii':False})
  • 接下来参考这篇文章,设置跨域问题,传送门,设置完后就可以在前端发送ajxa请求,请求数据。此时reffer和host虽然是本地的,但是已经可以请求了,这是因为django发送的请求的reffer和host是https://c.y.qq.com(你请求资源的URI)

     

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Cross-Origin Read Blocking (CORB) 是一项安全功能,用于阻止网页从不同源(即不同域名)读取敏感数据。如果 CORB 检测到跨域请求的数据属于敏感类型,它将阻止该请求并返回错误信息。 ### 回答2: 首先,我们需要了解同源策略(Same Origin Policy)。同源策略是一种安全机制,限制了网站在脚本中如何操作来自不同来源的文档、窗口或框架。简而言之,如果两个页面拥有协议、主机和端口号完全相同,那么它们就是同源的。 而当请求跨域资源时,服务器必须在响应中设置特定的HTTP头——CORS(Cross-Origin Resource Sharing)授权。这个头告诉浏览器是否允许一个页面访问来自不同源服务器的特定资源。如果服务器没有设置这个HTTP头,浏览器默认会阻止请求。 那么,什么是CORB呢?CORB是Chrome浏览器所实现的另一种安全机制,其目的在于防止来自不同源服务器的恶意代码,以及保护隐私信息。它会拦截并阻止一部分潜在的XSS攻击,并使渲染过程更高效。 当我们在Chrome中请求跨域资源时,如果返回的内容被Chrome识别为危险的MIME类型,并且服务器没有设置CORS授权的HTTP头,就会出现“Cross-Origin Read BlockingCORBBlocked Cross-Origin Response”的错误。这个错误意味着浏览器无法读取来自另一个域的响应,因此,浏览器会阻止访问这些跨域资源。 所以,解决这个错误的方法是服务器需要设置CORS授权的HTTP头。如果服务器无法设置这个HTTP头,我们就不能直接从JS中访问这些跨域资源了,而需要采取其它的处理方式,比如通过代理等。 ### 回答3: Cross-origin read blocking (CORB)是一种浏览器安全机制,旨在防止跨站脚本攻击和信息泄漏,防止恶意网站通过注入恶意脚本来窃取用户敏感信息。在实际应用中,由于站点间跨域问题,有可能会经常遭遇到“cross-origin read blocking (corb) blocked cross-origin response”的提示。 “cross-origin read blocking (corb) blocked cross-origin response”提示意味着当前页面试图读取另一个域名下的资源,然而在跨域请求中,目标站点返回了一个被拦截的响应。这通常意味着当前页面试图从一个不受信任的域名下请求资源。浏览器会拦截这个跨域请求,防止页面从其他站点获取潜在的危险信息。 要解决“cross-origin read blocking (corb) blocked cross-origin response”问题,有几种方法: 1. 通过设置CORS(跨域资源共享)来允许站点间跨域访问。这需要在目标站点上设置一些标头,例如“Access-Control-Allow-Origin”。 2. 可以考虑使用JSONP(JSON with padding)方法,这是一种跨域请求的方法,它可以通过动态地在页面上添加一个脚本来请求数据。 3. 使用代理服务器可以将跨域请求转发到另一个域名下,以避免被拦截。 总体而言,“cross-origin read blocking (corb) blocked cross-origin response”提示意味着当前页面试图从一个不受信任的站点获取潜在的危险信息。为了保障用户安全和信息安全,浏览器会阻止这样的跨域请求。开发者可以通过设置CORS或使用JSONP等方法来解决这一问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值