前提
最近在学习Web安全的过程中接触了同源策略这么一条基本的安全原则,但是一直对其中的部分问题有所不解,经过几天的学习和查找资料,现在对Web的同源策略作一个简单的概括。
同源策略概述
同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。
我们将使用拆字法来理解同源策略相关的问题,首先我们将“同源策略”拆分为两个部分,第一个是 “同源” ;第二个是 “策略”。
一、同源:同一个来源
首先我们弄懂什么算是同一个来源(字面上):以http://a.bcd.com/dir1/test1.html为例子
请求地址 | 结果 | 原因 |
---|---|---|
http://a.bcd.com/dir1/test2.html | 成功 | 同一域名,相同文件夹 |
http://a.bcd.com/dir2/test.html | 成功 | 同一域名,不同文件夹 |
https://a.bcd.com/dir1/test2.html | 失败 | 不同协议,http与https |
http://a.bcd.com:8000/dir2/test2.html | 失败 | 不同端口 |
http://a.efg.com/dir2/test2.html | 失败 | 不同域名 |
以上表格非常直观的表述了什么算是同一个来源的问题。
对于这个问题我们不多作讲解,因为大家都能理解同源策略的本质就是防止跨域资源访问。那么同源的概念也就十分好理解。而大多数人不能理解实际上是策略的问题,因为这一个部分无关代码,是一个和“人”相关的概念。
二、策略:为了客户安全
为了理解策略相关的概念,我们需要有一些实验的结果(实验过程的代码就不贴出来了):
-
实验一、不使用JS进行跨域请求发送,使用form表单的submit方法发送Get跨域请求,服务器不对响应头进行设置。
-
结果:请求发送,服务器端接受到Get请求,返回码为200,浏览器显示拦截了跨域请求
-
实验二、使用Ajax发送跨域请求,服务器不对响应头进行设置
-
结果:请求发送,服务器端接受到请求,返回码为200,浏览器显示拦截了跨域请求
实验一、二结果分析:
服务器不对跨域请求进行任何甄别,只要请求正确,服务器会正常返回内容,而内容在浏览器被拦截。
这说明了一个很重要的点:
同源策略是浏览器策略,并且同源策略不影响服务器端的操作和响应。
事实上这就说明了这一条策略最关键的一个点,整个策略是为了浏览器,也就是为客户而实现的。因此同源策略保护了使用浏览器的客户,这一条是客户端安全中最重要的原则,我们所要保护和黑客所要窃取的资源都是客户的资源,这也就可以解释为什么关闭浏览器同源策略对客户本身是危险的:因为客户会因为同源策略的关闭而无法保证自己不会被Cookie劫持。