同源策略
目录
¶概述
❓为什么会需要同源策略这种东西?
- 互联网早期,Cookie 解决了状态管理的问题,同样带来了 Cookie 管理的问题,如果 A 网页设置了 Cookie,B 网页能否使用 A 网页设置的 Cookie(Cookie 可是包括了用户隐私的数据);如果 A 网页具有一个脚本,在网页打开时就会运行,这个网页能否在本地浏览器访问 B 网页时也运行尼?
- 诸如此类的安全性问题,需要引入同源策略才能解决,同源策略是浏览器重要的安全策略,用于限制一个
Origin(源)
的文档或者它加载的脚本如何能与另一个源的资源进行交互。它能帮助阻隔恶意文档,减少可能被攻击的媒介
❓同源策略中的同源是什么意思?
- 如果两个 URL 的
protocol
、port
和host
都相同的话,则称这两个 URL 是同源的
✨下表给出了与 URL http://store.company.com/dir/page.html
的源进行对比的示例:
URL | 结果 | 原因 |
---|---|---|
http://store.company.com/dir2/other.html | 同源 | 只有路径不同 |
http://store.company.com/dir/inner/another.html | 同源 | 只有路径不同 |
https://store.company.com/secure.html | 失败 | 协议不同 |
http://store.company.com:81/dir/etc.html | 失败 | 端口不同 ( http:// 默认端口是 80) |
http://news.company.com/dir/other.html | 失败 | 主机不同 |
同源策略(Same Origin Policy)是一种约定,它是浏览器最核心也是最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说 Web 是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现——百度百科
📓所有的同源策略都是由浏览器执行的,所有的限制都是因为浏览器的作用,这是因为浏览器为保护用户隐私而才去进行的措施
¶缺少同源策略的安全性问题
🤔我知道了同源策略是为了用户的安全性考虑才增加的,但是我就是不用同源策略,会有什么安全问题?
- 缺少同源策略的接口请求
- 缺少同源策略的 Dom 查询
¶没有同源策略限制的 Ajax 请求
🎶如果没有XMLHttpRequest
同源策略,黑客可以进行CSRF(跨站请求伪造)攻击
⛵用户被入侵的攻击方式如下:
- 用户登录了自己的银行页面
http://mybank.com
,http://mybank.com
向用户的 cookie 中添加用户标识 - 用户浏览了恶意页面
http://evil.com
,执行了页面中的恶意 AJAX 请求代码 http://evil.com
向http://mybank.com
发起 AJAX HTTP 请求,请求会默认把http://mybank.com
对应 cookie 也同时发送过去- 银行页面从发送的 cookie 中提取用户标识,验证用户无误,response 中返回请求数据【此时恶意网页获取了用户的数据】
🎶甚至由于 Ajax 是在后台执行的,用户在感知不到的情况下就失去了自己的隐私
¶没有同源策略限制的 Dom 查询
🎶如果没有 Dom 同源策略,不同域的iframe
之间可以相互访问,黑客仍然可以进行攻击
⛵黑客的攻击步骤如下:
- 做一个假网站,里面用 iframe 嵌套一个银行网站
http://mybank.com
- 把 iframe 宽高啥的调整到页面全部,此时除了域名,别的部分和银行的网站没有任何差别,如果用户不仔细注意域名的区别,将会以为这个冒充的网站就是官网
- 此时用户输入账号密码,伪造网站可以跨域访问到
http://mybank.com
的 dom 节点,就可以拿到用户的账户密码了
¶总结
📓如今看来拥有同源策略还能保证用户上网稍微安全一点,能够让用户规避到一些很容易遇到的攻击手段。但是,同源策略的确能够规避一些危险,并不代表有了同源策略就安全,只是说同源策略是一种浏览器最基本的安全机制
¶同源策略的限制
✨如果两个 URL 非同源,共有三种行为受到限制
- 不能获取不同源的 cookie,LocalStorage 和 indexDB
- 不能获取非同源的 DOM
- 不能发送非同源的 ajax 请求。(可以向非同源的服务器发起请求,但是返回的数据会被浏览器拦截)
如果想要解决以上三种由于同源策略造成的限制,就需要跨域
📖关于跨域相关记录可以在我的博客中查找