首页 > 技术文章 > 毁人不倦-令人困惑的浏览器安全策略:同源策略

kexxxfeng 2017-03-05 14:43 原文

同源策略(The same-origin policy)

这是浏览器的一个基本却又非常重要的安全策略,浏览器会限制对异源(异域)(我们常称之为别人家的站点)的资源操作。打个比方,你不会让老王来你家,也不允许他在你家墙上打个洞,装个监控啥的。通过这个比喻你就知道同源策略的重要性了。

同源策略主要针对脚本(script)的行为进行限制,而<script>,<link>,<img>,<iframe>,<object>等带有src属性的dom元素一般不受影响,这也很好理解,你可以禁止老王进你家,但是无法限制他在自己家装个雷达对你家进行监控。因此,在没有得到授权的情况下,用javascript脚本操作异域的资源,那是不允许的。科学的说法应该是:浏览器允许发起请求,但如果响应中没有包含对方的许可的话,浏览器就会屏蔽响应结果,不给你用。经常会抛出这样的异常: XMLHttpRequest cannot load http://www.othersite.com/. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://www.mysite.com' is therefore not allowed access.

源(Origin)

唠叨了半天异源(异域),科学的解释一下什么是源(Origin)

公式:Origin = [protocol]://[domain]:[port]

Origin是你的页面所在的位置。例如我有个站点www.mysite.com,那么它的就是http://www.mysite.com:80,其中[protocol]的缺省值是http[port]的缺省值是80

不管我的站点在哪个页面www.mysite.com/p/1.html,只要[protocol],[domain],[port]三者相同则视为同源,或者叫同域,通常称之为同域,因为我们通常都是叫别人的小名二狗子,而不会称呼其大名犬次郎

更多示例:

URL Origin
http://www.mysite.com/p/1.html http://www.mysite.com
https://wwww.mysite.com/p/1.html https://www.mysite.com
http://app.mysite.com/p/1.thml http://app.mysite.com
http://www.mysite.net/p/1.html http://www.mysite.net
http://www.mysite.com:9000/p/1.html http:www.mysite.com:9000
http://www.mysite.com/news/fresh.html http://www.mysite.com

解决访问跨域资源的问题

虽然是安全了,但是如果想从我的www.mysite.com去我的分站son.mysite.com获取点东西也会被同源策略禁止,这就不是我们想要的了,那怎么办呢?可以利用<script>等不受同源策略限制的dom元素绕过去,这种方式称之为jsonp,这是很多年前就提出来的方法,很巧妙不过很繁琐,渐渐地不怎么再使用了,有兴趣的自行google

还有现代化的解决方案:CORS(Cross-Origin Resource Sharing)。还记得同源策略的规定吗?通过屏蔽响应结果的方式保证信息安全,也就是说浏览器并没有阻止发起跨域请求。浏览器如果在跨域请求的响应(Http Response Headers)中发现了对方的许可就会认为是安全的。这套标准称之为CORS。

这套标准规定一系列的Http Headers,让服务器申明哪些资源是可以被谁访问,浏览器通过解析响应头部就能知道是否得到了许可。

举两个简单的

推荐阅读