浏览器安全可以分为三大块——Web 页面安全、浏览器网络安全和浏览器系统安全。
在没有安全保障的 Web 世界中,我们是没有隐私的,因此需要安全策略来保障我们的隐私和数据的安全。
这就引出了页面中最基础、最核心的安全策略:同源策略(Same-origin policy)。
什么是同源策略
要了解什么是同源策略,我们得先来看看什么是同源。
如果两个 URL 的协议、域名和端口都相同,我们就称这两个 URL 同源。
比如下面这两个 URL,它们具有
相同的协议 HTTPS、
相同的域名 time.geekbang.org,
以及相同的端口 443,
所以我们就说这两个 URL 是同源的:
https://time.geekbang.org/?category=1
https://time.geekbang.org/?category=0
浏览器默认两个相同的源之间是可以相互访问资源和操作 DOM 的。
两个不同的源之间若想要相互访问资源或者操作 DOM,那么会有一套基础的安全策略的制约,我们把这称为同源策略。
具体来讲,同源策略主要表现在 DOM、Web 数据和网络这三个层面。
第一个,DOM 层面。同源策略限制了来自不同源的 JavaScript 脚本对当前 DOM 对象读和写的操作。
这里我们还是拿极客时间的官网做例子,打开极客时间的官网,然后再从官网中打开另外一个专栏页面,如下图所示:
第二个,数据层面。
同源策略限制了不同源的站点读取当前站点的 Cookie、IndexDB、LocalStorage 等数据。
由于同源策略,我们依然无法通过第二个页面的 opener 来访问第一个页面中的 Cookie、IndexDB 或者LocalStorage 等内容。
第三个,网络层面。
同源策略限制了通过 XMLHttpRequest 等方式将站点的数据发送给不同源的站点。
这也是同源策略带来的最大使用上的不便。
不过现在有很多好用的方法来实现不同源的跨域。
CSP
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CSP
总结
同源策略会隔离不同源的 DOM、页面数据和网络通信,进而实现 Web 页面的安全性。
不过鱼和熊掌不可兼得,要绝对的安全就要牺牲掉便利性,因此我们要在这二者之间做权衡,找到中间的一个平衡点,也就是目前的页面安全策略原型。
总结起来,它具备以下三个特点:
页面中可以引用第三方资源,不过这也暴露了很多诸如 XSS 的安全问题,因此又在这种开放的基础之上引入了 CSP 来限制其自由程度。
使用 XMLHttpRequest 和 Fetch 都是无法直接进行跨域请求的,因此浏览器又在这种严格策略的基础之上引入了跨域资源共享策略,让其可以安全地进行跨域操作。
两个不同源的 DOM 是不能相互操纵的,因此,浏览器中又实现了跨文档消息机制,让其可以比较安全地通信。
同源策略、CSP 和 CORS 之间的关系
同源策略就是说同源页面随你瞎搞,但是不同源之间想瞎搞只能通过浏览器提供的手段来搞
比如说
- 读取数据和操作 DOM 要用跨文档机制
- 跨域请求要用 CORS 机制
- 引用第三方资源要用 CSP