同源策略
同源策略是浏览器对跨源资源请求的一种安全策略,
用于限制从一个源加载的文档和脚本与不同源的资源进行交互。
(浏览器并不阻止请求的发送,而是对请求进行拦截)
同源定义
同源需要同时满足:同协议、同域名、同端口
如 '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 泄漏