同源策略与跨域资源共享(CORS)详解
字数 1831 2025-11-14 01:18:08

同源策略与跨域资源共享(CORS)详解

1. 同源策略(Same-Origin Policy)的基本概念

同源策略是浏览器最核心的安全机制之一,用于限制不同源的文档或脚本之间的交互。其核心规则如下:

  • 同源定义:协议(Protocol)、域名(Domain)、端口(Port)完全一致。例如:
    • https://example.com/app1https://example.com/app2 同源(协议、域名、端口均相同)。
    • https://example.comhttp://example.com 不同源(协议不同)。
  • 限制范围
    • Cookie、LocalStorage、IndexedDB 等存储的读取。
    • DOM 元素的访问(例如通过 iframe 嵌套不同源页面时无法操作其内容)。
    • AJAX 请求的响应(默认被浏览器拦截)。

2. 为什么需要跨域资源共享(CORS)?

同源策略虽然安全,但实际业务中常需要合法跨域访问(例如前端域名 https://frontend.com 需要调用后端 API https://api.com)。为此,W3C 提出了 CORS 标准,允许服务器声明哪些外部源有权访问其资源。

3. CORS 的工作原理

CORS 通过 HTTP 请求头(Request Headers)和响应头(Response Headers)实现跨域权限控制。其流程分为两类:

(1)简单请求(Simple Request)

需同时满足以下条件:

  • 请求方法为 GETPOSTHEAD
  • 请求头仅包含以下字段:
    • AcceptAccept-LanguageContent-LanguageContent-Type(仅限 application/x-www-form-urlencodedmultipart/form-datatext/plain)。

流程示例

  1. 浏览器发送请求,自动在请求头中添加 Origin: https://frontend.com
  2. 服务器检查 Origin,若允许该源,则在响应头中返回:
    Access-Control-Allow-Origin: https://frontend.com  // 或使用通配符 *  
    
  3. 浏览器比对响应头中的 Access-Control-Allow-Origin 与当前源,一致则允许访问响应内容。

(2)预检请求(Preflight Request)

触发条件(不满足简单请求时):

  • 请求方法为 PUTDELETE 或自定义方法(如 PATCH)。
  • 请求头包含自定义字段(如 Authorization)。
  • Content-Typeapplication/json

流程示例

  1. 浏览器先发送 OPTIONS 预检请求,头信息包含:
    Origin: https://frontend.com  
    Access-Control-Request-Method: PUT  
    Access-Control-Request-Headers: Authorization, Content-Type  
    
  2. 服务器响应预检请求,声明允许的源、方法、头字段:
    Access-Control-Allow-Origin: https://frontend.com  
    Access-Control-Allow-Methods: GET, POST, PUT  
    Access-Control-Allow-Headers: Authorization, Content-Type  
    Access-Control-Max-Age: 86400  // 预检结果缓存时间(秒)  
    
  3. 浏览器确认响应合法后,才发送实际请求。

4. CORS 的安全风险与配置陷阱

  • 通配符 * 的误用
    • 若响应头设置为 Access-Control-Allow-Origin: *,则任何源均可访问资源,但此时浏览器会禁止携带凭据(如 Cookie)。
    • 若需携带凭据,必须明确指定域名(如 Access-Control-Allow-Origin: https://trusted.com)并设置 Access-Control-Allow-Credentials: true
  • Origin 校验漏洞
    • 错误的正则表达式(如 https://*.example.com 实际应写为 https://.example.com)可能导致子域名被恶意利用。
  • 预检请求缓存攻击
    • 过长的 Access-Control-Max-Age 可能使攻击者在合法用户预检后长期绕过源检查。

5. 防御建议

  1. 严格限制允许的源:避免使用通配符,动态校验 Origin 头并白名单化。
  2. 最小化权限:仅开放必要的 HTTP 方法和头字段。
  3. 避免凭据与通配符共存:若使用 Access-Control-Allow-Credentials: true,则必须指定具体源。
  4. 结合其他安全机制:如 CSRF Token、Session 验证等,降低 CORS 配置错误的影响。

通过以上步骤,CORS 在保障跨域需求的同时,最大限度地维护了同源策略的安全边界。

同源策略与跨域资源共享(CORS)详解 1. 同源策略(Same-Origin Policy)的基本概念 同源策略 是浏览器最核心的安全机制之一,用于限制不同源的文档或脚本之间的交互。其核心规则如下: 同源定义 :协议(Protocol)、域名(Domain)、端口(Port)完全一致。例如: https://example.com/app1 和 https://example.com/app2 同源 (协议、域名、端口均相同)。 https://example.com 和 http://example.com 不同源 (协议不同)。 限制范围 : Cookie、LocalStorage、IndexedDB 等存储的读取。 DOM 元素的访问(例如通过 iframe 嵌套不同源页面时无法操作其内容)。 AJAX 请求的响应(默认被浏览器拦截)。 2. 为什么需要跨域资源共享(CORS)? 同源策略虽然安全,但实际业务中常需要合法跨域访问(例如前端域名 https://frontend.com 需要调用后端 API https://api.com )。为此,W3C 提出了 CORS 标准,允许服务器声明哪些外部源有权访问其资源。 3. CORS 的工作原理 CORS 通过 HTTP 请求头(Request Headers)和响应头(Response Headers)实现跨域权限控制。其流程分为两类: (1)简单请求(Simple Request) 需同时满足以下条件: 请求方法为 GET 、 POST 或 HEAD 。 请求头仅包含以下字段: Accept 、 Accept-Language 、 Content-Language 、 Content-Type (仅限 application/x-www-form-urlencoded 、 multipart/form-data 、 text/plain )。 流程示例 : 浏览器发送请求,自动在请求头中添加 Origin: https://frontend.com 。 服务器检查 Origin ,若允许该源,则在响应头中返回: 浏览器比对响应头中的 Access-Control-Allow-Origin 与当前源,一致则允许访问响应内容。 (2)预检请求(Preflight Request) 触发条件 (不满足简单请求时): 请求方法为 PUT 、 DELETE 或自定义方法(如 PATCH )。 请求头包含自定义字段(如 Authorization )。 Content-Type 为 application/json 。 流程示例 : 浏览器先发送 OPTIONS 预检请求,头信息包含: 服务器响应预检请求,声明允许的源、方法、头字段: 浏览器确认响应合法后,才发送实际请求。 4. CORS 的安全风险与配置陷阱 通配符 * 的误用 : 若响应头设置为 Access-Control-Allow-Origin: * ,则任何源均可访问资源,但此时浏览器会禁止携带凭据(如 Cookie)。 若需携带凭据,必须明确指定域名(如 Access-Control-Allow-Origin: https://trusted.com )并设置 Access-Control-Allow-Credentials: true 。 Origin 校验漏洞 : 错误的正则表达式(如 https://*.example.com 实际应写为 https://.example.com )可能导致子域名被恶意利用。 预检请求缓存攻击 : 过长的 Access-Control-Max-Age 可能使攻击者在合法用户预检后长期绕过源检查。 5. 防御建议 严格限制允许的源 :避免使用通配符,动态校验 Origin 头并白名单化。 最小化权限 :仅开放必要的 HTTP 方法和头字段。 避免凭据与通配符共存 :若使用 Access-Control-Allow-Credentials: true ,则必须指定具体源。 结合其他安全机制 :如 CSRF Token、Session 验证等,降低 CORS 配置错误的影响。 通过以上步骤,CORS 在保障跨域需求的同时,最大限度地维护了同源策略的安全边界。