对于浏览器的同源策略你是怎样理解的呢?

希望得到您比较详细的解答,谢谢!!
关注者
244
被浏览
55,995

7 个回答

1.什么是同源策略

同domain(或ip),同端口,同协议视为同一个域,一个域内的脚本仅仅具有本域内的权限,可以理解为本域脚本只能读写本域内的资源,而无法访问其它域的资源。这种安全限制称为同源策略。

2.为什么说同源策略限制了人类文明的发展

安全性和方便性是成反比的,十位数的密码提高了安全性,但是不方便记忆。同样,同源策略提升了Web前端的安全性,但牺牲了Web拓展上的灵活性。设想若把html、js、css、flash,image等文件全部布置在一台服务器上,小网站这样凑活还行,大中网站如果这样做服务器根本受不了的,可用性都不能保证的话,安全性还算个吊? 所以,现代浏览器在安全性和可用性之间选择了一个平衡点。在遵循同源策略的基础上,选择性地为同源策略“开放了后门”。 例如img script style等标签,都允许垮域引用资源,严格说这都是不符合同源要求的。然而,你也只能是引用这些资源而已,并不能读取这些资源的内容,不信你可以试试:在你自己的域内读取百度logo图片的内容,以读取到二进制数据为准。 你很快发现这是不可能的,你顶多只能判断这张图片是否存在(使用的img标签的onerror属性 )。因此浏览器降低了那么一点点安全性,却大大提升网站布置的灵活性。

尽管浏览器开放了“后门”,然而现代文明却仍不满足。打破同源策略的方法有很多,抛开漏洞不谈,Server端的大数据整合和浏览器的插件往往就充当着这样一个角色。我有一个同事,由于在淘宝上买过一个自慰器,从此不管他打开哪个网站都会有自慰器的广告投递,弄得人家好尴尬。我手把手教他清除Cookie,发现者根本不奏效。(吐槽:我们使用的是一个公网IP,后来我吃惊的发现我的电脑中也出现了自慰器的广告).好吧,这样的例子还有很多。虽然,攻城狮们越来越肆无忌惮的浪,然而浏览器们依旧保持着他那份应有的节操(国产浏览器除外)。

3.如果没有同源策略,普通用户将无密可保。

尽管浏览器遵循同源策略,你仍可以发现你的访问过的网站、买过的东西、搜索过的字串、甚至你的兴趣爱好,都可以被远端分析出来。我们姑且认为这些大数据分析者是有节操的,不会随意泄露这些数据。如果浏览器不遵循同源策略,那么情况更糟:网站站长、广告联盟、流量统计商、xss黑客,随便哪个人都将无障碍的获取私密信息,例如各个网站的Cookie、email的邮件内容、OA页面的内容、QQ空间里设置为隐私的照片等,不止这些,听说过CSRF吗,这里不做科普,通过CSRF还可能用你的邮箱群发发邮件、在OA里面填上你旷工一天、在第三方支付平台里自由转账、用你的账号在知乎上胡乱发言降低你的big,等等。

感谢同源策略,我才有勇气使用互联网。

4.跨域漏洞

尽管各个浏览器都遵循都远策略,可是通过一些奇淫巧计会绕过同源的限制进行跨域。举个例子

UC浏览器跨本地域XSS可盗取任意域Cookie

,一段js代码本来是普通http域的权限,可是用过下载页面的一个xss,从而具有了file域的权限,而file域对权限限制也不严格,允许从file域跨到任意一个http域权限去执行js代码,经过了两次跨域操作,最终实现了普通http域向任意一个域注射js的目的,同源策略被完全破坏。

4.最严重的跨域——跨特权域

所有跨域行为中最严重的莫过于跨特权域。在客户端中,有一些域的权限比较高,例如file://这个协议域,ie中允许调用ActiveX执行cmd,Webkit中可以读取磁盘上的文件。另外还有客户端自定义的特权域,例如Chrome的chrome://downloads/域,有着执行exe的权限。这事儿太严重了,这不仅意味着任意一个网站都可以浏览/修改你的浏览器配置,而且可以不经你同意上传文件,甚至会在你的电脑上安装木马。跨特权域最经典的例子莫过于黑哥去年讲的 《跨过的那些客户端》。

讲到这里题主应该理解了吧。

什么是同源策略呢?通常一个概念出来之后,我会从生活的实际例子找到解析,你可以想象一下,假如你们家的房子,是不是不允许陌生人进入,如果可以随便进入,那么久有可能被盗了,那么这个时候,锁头和钥匙就出现了为了保证家的安全。

所以我们引出浏览器的同源策略,就是指必须在同一个协议,域名,端口号下,而且三者必须一致的。这个时候,我们就说是同源。

举个例子:

https://www.angular.cn:80/guide/inputs-outputs
  • http:// 是我们所说的协议。
  • angular.cn 是我们所说的域名。
  • 80 表示端口号。

所以就会牵引出一个问题,不同源的数据交互问题,如果是以下两个链接交互数据,可以通过同源策略的检测:

https://www.angular.cn:80/guide/inputs-outputs
	https://www.angular.cn:80/guide/index

而如果是以下这样的链接交互数据,则不能通过同源策略的检测:

http://www.child.a.com/test/index.html ----失败,域名不同
	https://www.a.com/test/index.html ----失败,协议不同
	http://www.a.com:8080/test/index.html ----失败,端口号不同

有哪些是不受同源策略限制

  • 页面上的链接,比如 a 链接。
  • 重定向。
  • 表单提交。
  • 跨域资源的引入,比如:script, img, link, iframe。

点击关注,第一时间了解华为云新鲜技术~