Skip to content
大纲

同源策略

同源策略是浏览器对跨源资源请求的一种安全策略,
用于限制从一个源加载的文档和脚本与不同源的资源进行交互。
(浏览器并不阻止请求的发送,而是对请求进行拦截)

同源定义

同源需要同时满足:同协议、同域名、同端口

如 'http://www.abc.com' 与 'http://www.abc.com/some/dir' 同源

而 'https://xx.abc.com' 与 'http://oo.abc.com' 在以下方面不符合同源条件

  • 'https' 与 'http' 为不同的协议
  • 'xx.abc.com' 与 'oo.abc.com' 为不同域名
  • 'https' 默认 443 端口,'http' 默认 80 端口

源的更改

可以通过脚本将 document.domain 设置为当前与或其当前域的父域,如

js
document.domain;
// => home.xxx.com
document.domain = "xxx.com"; // ok
document.domain = "note.xxx.com"; // error

访问限制

同源策略对存储数据访问进行控制

  • 对于 localStorage 和 indexedDB
    • 按源分隔
    • 禁止跨源读写操作
  • 对于 cookies
    • 页面可以为本域和任何父域设置 cookie
    • 不限制协议和端口号
    • 可以使用 domian, path, secure, http-only 等限制访问性
    • 读取 cookie 时无法获取其具体来源

同源策略对跨源访问进行控制

  • 通常允许跨源写操作,如链接、重定向以及表单提交
  • 通常允许跨源资源嵌入,如 <script>, css, <img>, <video>, @font-face, <iframe>
  • 通常禁止跨源读操作

跨源攻击

假设没有同源策略,则会有以下安全问题

  • 钓鱼网站:通过内嵌 iframe 页面仿造钓鱼页面获取用户信息
  • cookie 泄漏