Opaque Response Blocking (ORB)是什么
最直观的,当你看到开发者工具 - 网络面板中,请求的资源的状态为: (failed)net::ERR_BLOCKED_BY_ORB ,就是遇到 ORB 了。
Opaque Response Blocking (ORB),也被称作 Cross-Origin Read Blocking (CORB)++,是一种浏览器安全策略,旨在增强网页的安全性,防止跨域读取敏感数据。ORB通过限制跨域HTTP响应的访问来工作,特别是当响应被认为是不透明的(opaque)时。这意味着,如果一个资源的MIME类型被浏览器判定为不安全,那么即使该资源是通过CORS(跨源资源共享)策略允许跨域访问的,浏览器也不会允许读取这个资源的内容。
ORB策略特别关注阻止以下类型的MIME类型:
- HTML MIME类型
- JSON MIME类型
- XML MIME类型
这些类型的响应如果被判定为不透明,浏览器将阻止它们的内容被读取,以防止潜在的侧信道攻击,例如Spectre攻击。
ORB的实现细节包括对响应的MIME类型进行检查,并根据一系列预定义的规则来决定是否允许访问响应内容。例如,如果响应的MIME类型是JSON,并且响应的状态码是206(Partial Content),那么ORB将阻止访问该响应的内容。此外,ORB还考虑了X-Content-Type-Options
头部的nosniff
指令,以及响应的状态码和内容。
ORB的目的是提高网页应用的安全性,同时保持对现有网页的兼容性。它是一个正在被标准化并在一些浏览器中实现的功能,例如Firefox。通过实施ORB,浏览器可以更有效地保护用户的敏感数据不被恶意网站访问。
如何设置允许
ORB(Opaque Response Blocking)是一种浏览器安全特性,用于阻止跨域访问不透明的响应。通常情况下,这是浏览器默认的行为,不需要用户去特别允许或配置。然而,如果你是开发者,并且需要在开发过程中测试或绕过ORB限制,以下是一些可能的方法:
CORS(Cross-Origin Resource Sharing): 确保服务器配置了适当的CORS头部,允许你的网页访问跨域资源。
JSON with Padding (JSONP): 对于某些类型的请求,比如JSONP,可以作为跨域请求的一种方式,但这通常只限于GET请求。
CORS Anywhere: 使用像CORS Anywhere这样的代理服务,可以绕过CORS限制。
浏览器插件或扩展: 有些浏览器扩展可以修改请求或响应头部,允许跨域请求。
开发服务器配置: 如果你正在使用开发服务器,确保服务器配置了适当的CORS头部。
Fetch API 与
mode: 'cors'
: 当使用Fetch API时,确保请求的模式设置为cors
,这样浏览器会尝试执行CORS请求。服务器端设置: 修改服务器配置,以发送适当的Access-Control-Expose-Headers,允许特定的响应头部被跨域访问。
内容安全策略(Content Security Policy, CSP): 通过CSP头部的
cross-origin
指令,可以指定哪些资源可以被跨域访问。Web服务器配置: 在Web服务器上设置适当的CORS规则,比如Apache或Nginx的配置。
请注意,绕过ORB可能会带来安全风险,因为它允许跨域访问可能包含敏感信息的资源。因此,在生产环境中,通常不建议这样做。如果你是网站管理员或开发者,确保你了解CORS和安全性的相关知识,并采取适当的措施来保护你的网站和用户数据。如果你是普通用户,通常不需要关心ORB,因为它是浏览器自动处理的。
具体配置方法
设置CORS(跨源资源共享)通常在服务器端进行,以下是一些常见的服务器和语言的设置方法:
1. HTML5 的 <meta>
标签
在HTML文档的<head>
部分添加如下标签:
1 | <meta http-equiv="Access-Control-Allow-Origin" content="*"> |
这允许所有域名访问资源。出于安全考虑,实际生产环境中应该指定具体的域名而不是使用*
。
2. Apache服务器
在Apache服务器中,可以使用.htaccess
文件添加以下配置:
1 | Header set Access-Control-Allow-Origin "*" |
同样,这里使用*
允许所有域名,但最好指定具体域名。
3. Nginx服务器
在Nginx配置文件中,可以在server块中添加:
1 | location / { |
这将在响应中添加Access-Control-Allow-Origin
头。
4. Node.js (Express框架)
在Node.js的Express应用中,可以使用中间件设置CORS:
1 | const express = require('express'); |
5. Python (Flask框架)
在Flask应用中,可以使用Flask-CORS扩展来设置CORS:
1 | from flask import Flask |
6. Java (Spring框架)
在Spring框架中,可以使用@CrossOrigin
注解来允许CORS:
1 | import org.springframework.web.bind.annotation.CrossOrigin; |
或者在配置类中设置全局CORS配置:
1 | import org.springframework.context.annotation.Configuration; |
注意事项
- 在生产环境中,出于安全考虑,应避免使用
*
作为Access-Control-Allow-Origin
的值,而是应该指定具体的域名。 - CORS设置应该根据实际需求来配置,例如,你可能需要设置
Access-Control-Allow-Methods
和Access-Control-Allow-Headers
等其他CORS相关的响应头。
以上是一些常见的服务器和框架的CORS设置方法,根据你的具体环境和需求选择合适的方法进行配置。