同源策略再理解

关于同源策略

同源策略是一种约定,它是浏览器最核心也最基础的安全功能,如果缺少了同源策略,则浏览器的正常功能都会受到影响,可以说web是建立在同源策略之上的,浏览器只是对同源策略的一种实现。

以上是同源策略的百度百科定义。查阅有关同源策略的文章、资讯、或者书籍大多也都会看到类似的解释,如何理解呢?

先来看如果没有了同源策略会是什么样子。

假设没有同源限制,A网站的API可以被任何来源的AJAX请求访问,包括获取用户的隐私信息,只看用户有没有登录,现在有个坏人做了一个网站B,坏人在B网页中用AJAX访问A网站的API,如果一个用户访问B之前已经登录了A,那这个请求包含A网站的cookie信息,也就会被A网站认为用户已经登录,这样用户在A网站的隐私信息就泄露给了控制B网站的坏人。

其实同源策略就是说一个网站的api接口定义,只允许自己网站的网页来请求访问。比如说淘宝网的一个接口比如长这个样子:http://taobao.com/api/shoppingCart/list
请求这个接口就可以获得你的购物车中的商品,按照正常的操作流程,你自己登陆你自己的淘宝账号,点击右上角购物车的图标,网页发送这个接口请求到淘宝的后台然后网站在新的页面返回你的购物车中的商品,于是你看到了你自己的购物车中都有些什么。此时你想:这个接口是开放的,任何人都知道淘宝查看购物车商品的接口是http://taobao.com/api/shoppingCart/list,如果没有同源策略会怎样?
假如我是一个黑客,我做了一个网页运行在xiaoyu.com上,在这个网站上我写好了请求脚本去请求http://taobao.com/api/shoppingCart/list这个接口,然后我‘诱骗’你在登陆过自己的淘宝之后打开我的网站xiaoyu.com此时在你的浏览器中就会运行我的请求脚本了,因为我发送的请求是http://taobao.com/api/shoppingCart/list,而你之前有登陆过淘宝,而且**浏览器的cookie机制导致它在请求接口的时候会带上来自这个域下的cookies**所以你看到了么,这是一个完美的请求,该有的都有,接口地址正确,请求头中带的cookies也没问题,淘宝的服务器看到这个请求不会发现有任何哪里不对,它就会按正常的流程返回购物车中的商品信息,然后我在请求的成功回调里就可以做任何我想做的事情了。这只是拿一个购物车商品的接口举例子,如果是其他更加重要的接口(比如说删除或者购买商品的操作接口)那造成的影响就大了。

所以其实是同源策略也是基于:1、浏览器向一个域发送请求的时候会带上这个域的cookies(而不管当前页面是否运行在哪个域)。2服务器端受到请求校验cookies通过后就理所当然的认为这是自家的程序员开发的网页发出的合法请求于是就乖乖返回了结果或者执行了操作。这两点‘简单’的设计让浏览器发送请求更加方便也让服务器处理请求更加方便但是却有着巨大的安全漏洞,那就是我们无法保证发送请求的脚本是运行在该运行的网站上,我在家写一个attack.html的页面在里面请求淘宝接口,只要我拿到了你淘宝的cookies我把网页用浏览器本地打开执行,攻击就完成了,这太简答了!所以浏览器才会有同源策略,不是运行在taobao.com的页面请求taobao的接口是跨域的,不能给你通过。

另外,同源策略只是阻止你读取ajax返回的内容,实际上请求依然发送到了服务器。

有疑问?下篇讲一讲跨域就懂了