浏览器的ORB安全策略和允许办法

Opaque Response Blocking (ORB)是什么

最直观的,当你看到开发者工具 - 网络面板中,请求的资源的状态为: (failed)net::ERR_BLOCKED_BY_ORB ,就是遇到 ORB 了。

ORB的现象 :(failed)net::ERR_BLOCKED_BY_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限制,以下是一些可能的方法:

  1. CORS(Cross-Origin Resource Sharing): 确保服务器配置了适当的CORS头部,允许你的网页访问跨域资源。

  2. JSON with Padding (JSONP): 对于某些类型的请求,比如JSONP,可以作为跨域请求的一种方式,但这通常只限于GET请求。

  3. CORS Anywhere: 使用像CORS Anywhere这样的代理服务,可以绕过CORS限制。

  4. 浏览器插件或扩展: 有些浏览器扩展可以修改请求或响应头部,允许跨域请求。

  5. 开发服务器配置: 如果你正在使用开发服务器,确保服务器配置了适当的CORS头部。

  6. Fetch API 与 mode: 'cors': 当使用Fetch API时,确保请求的模式设置为cors,这样浏览器会尝试执行CORS请求。

  7. 服务器端设置: 修改服务器配置,以发送适当的Access-Control-Expose-Headers,允许特定的响应头部被跨域访问。

  8. 内容安全策略(Content Security Policy, CSP): 通过CSP头部的cross-origin指令,可以指定哪些资源可以被跨域访问。

  9. 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
2
3
4
location / {
add_header 'Access-Control-Allow-Origin' '*';
# 其他配置...
}

这将在响应中添加Access-Control-Allow-Origin头。

4. Node.js (Express框架)

在Node.js的Express应用中,可以使用中间件设置CORS:

1
2
3
4
5
6
7
8
9
10
11
const express = require('express');
const cors = require('cors');

const app = express();

app.use(cors({
origin: '*', // 指定允许的域名,使用 '*' 允许所有域名
optionsSuccessStatus: 200 // 某些浏览器需要200成功状态
}));

// 其他路由和中间件...

5. Python (Flask框架)

在Flask应用中,可以使用Flask-CORS扩展来设置CORS:

1
2
3
4
5
6
7
from flask import Flask
from flask_cors import CORS

app = Flask(__name__)
CORS(app, resources={r"/*": {"origin": "*"}})

# 路由和视图函数...

6. Java (Spring框架)

在Spring框架中,可以使用@CrossOrigin注解来允许CORS:

1
2
3
4
5
6
7
8
9
10
11
12
13
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@CrossOrigin(origins = "*", allowedHeaders = "*")
public class MyController {

@GetMapping("/api/data")
public String getData() {
return "Your data here";
}
}

或者在配置类中设置全局CORS配置:

1
2
3
4
5
6
7
8
9
10
11
12
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**").allowedOrigins("*");
}
}

注意事项

  • 在生产环境中,出于安全考虑,应避免使用*作为Access-Control-Allow-Origin的值,而是应该指定具体的域名。
  • CORS设置应该根据实际需求来配置,例如,你可能需要设置Access-Control-Allow-MethodsAccess-Control-Allow-Headers等其他CORS相关的响应头。

以上是一些常见的服务器和框架的CORS设置方法,根据你的具体环境和需求选择合适的方法进行配置。

分享到:

评论完整模式加载中...如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理