浏览器同源策略与安全限制详解
字数 1543 2025-11-13 21:24:49
浏览器同源策略与安全限制详解
一、同源策略的基本概念
同源策略(Same-Origin Policy)是浏览器最核心的安全机制之一,用于限制不同源的文档或脚本之间的交互。其核心规则如下:
- 同源的定义:协议(Protocol)、域名(Domain)、端口(Port)完全一致。例如:
https://example.com/a.html与https://example.com/b.html同源。https://example.com与http://example.com不同源(协议不同)。https://a.example.com与https://b.example.com不同源(域名不同)。
- 限制范围:
- Cookie、LocalStorage 等存储访问。
- DOM 操作(如通过
iframe嵌入跨源页面时无法访问其内容)。 - AJAX 请求(通过
XMLHttpRequest或fetch发送的跨源请求会被浏览器拦截)。
二、同源策略的例外场景
- 允许跨源嵌入的资源:
<script src="...">(但无法直接读取跨源脚本的内容)。<img>、<link>、<video>等标签(仅可加载,不可直接操作内容)。<iframe>嵌入的页面(可通过postMessage通信,但无法直接访问 DOM)。
- 跨源写操作:
- 表单提交(如
<form>的action指向跨源 URL)不受限制,但需注意 CSRF 防护。
- 表单提交(如
三、跨源解决方案的原理与实现
-
CORS(跨源资源共享):
- 简单请求:满足以下条件时,浏览器自动在请求头添加
Origin,服务器需返回Access-Control-Allow-Origin:- 方法为 GET、POST、HEAD。
- 请求头仅含允许的字段(如
Content-Type为application/x-www-form-urlencoded)。
- 预检请求:非简单请求(如自定义头、PUT 方法)会先发送
OPTIONS请求,服务器需响应:Access-Control-Allow-Origin: https://example.com Access-Control-Allow-Methods: GET, POST, PUT Access-Control-Allow-Headers: X-Custom-Header - 凭据携带:若请求需携带 Cookie,需设置
withCredentials: true,且服务器返回Access-Control-Allow-Credentials: true。
- 简单请求:满足以下条件时,浏览器自动在请求头添加
-
JSONP(JSON with Padding):
- 原理:利用
<script>标签不受同源限制的特性,通过回调函数接收数据。 - 示例:
function handleResponse(data) { console.log(data); } const script = document.createElement('script'); script.src = 'https://api.example.com/data?callback=handleResponse'; document.body.appendChild(script); - 缺点:仅支持 GET 请求,缺乏错误处理机制。
- 原理:利用
-
postMessage 通信:
- 用于
iframe或新窗口间的跨源通信:// 发送方 otherWindow.postMessage('Hello', 'https://target.com'); // 接收方 window.addEventListener('message', (event) => { if (event.origin !== 'https://trusted.com') return; console.log(event.data); });
- 用于
-
代理服务器:
- 前端请求同源服务器,由服务器转发请求至跨源目标(如 Nginx 配置反向代理)。
四、安全实践与注意事项
- CORS 配置风险:
- 避免设置
Access-Control-Allow-Origin: *时携带凭据,可能导致信息泄露。 - 预检请求的缓存时间(
Access-Control-Max-Age)需合理设置,避免过长或过短。
- 避免设置
- CSRF 防护:
- 跨源请求仍需防范 CSRF(如通过 Token 验证、SameSite Cookie 属性)。
- postMessage 安全:
- 严格校验
event.origin,防止恶意页面伪造消息。
- 严格校验
五、总结
同源策略是浏览器安全的基础,理解其规则与例外场景有助于合理设计跨源方案。CORS 是主流解决方案,但需结合业务场景选择 JSONP、代理或 postMessage。同时,跨源通信必须兼顾安全性与兼容性。