同源策略与跨域资源共享(CORS)详解
字数 1831 2025-11-14 01:18:08
同源策略与跨域资源共享(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: https://frontend.com // 或使用通配符 * - 浏览器比对响应头中的
Access-Control-Allow-Origin与当前源,一致则允许访问响应内容。
(2)预检请求(Preflight Request)
触发条件(不满足简单请求时):
- 请求方法为
PUT、DELETE或自定义方法(如PATCH)。 - 请求头包含自定义字段(如
Authorization)。 Content-Type为application/json。
流程示例:
- 浏览器先发送 OPTIONS 预检请求,头信息包含:
Origin: https://frontend.com Access-Control-Request-Method: PUT Access-Control-Request-Headers: Authorization, Content-Type - 服务器响应预检请求,声明允许的源、方法、头字段:
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 // 预检结果缓存时间(秒) - 浏览器确认响应合法后,才发送实际请求。
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 在保障跨域需求的同时,最大限度地维护了同源策略的安全边界。