浏览器的安全基于同源策略(same-origin policy),根据 MDN 中对于同源策略的解释,它限制了一个源(origin)中加载文本或脚本与来自其他源(origin)中资源的交互方式。此文主要介绍同源政策,为接下去探讨跨域的一系列方式做准备。

同源含义

如果两个页面拥有相同的协议,端口(若指定),和主机,那么这两个页面就属于同一个源

同源指的三个相同

  • 协议相同(protocol)
  • 端口相同(如果指定)
  • 域名相同

端口协议域名解析:

http://www.company.com/dir/page.html

  • 协议是 http://
  • 域名是 www.company.com
  • 端口是 80 (未指定,默认)

同源策略的目的

同源政策是必须的,譬如 A 网站的 cookie 中含有敏感信息,用户若是访问 A 网站后再去访问其他网站,若是无同源政策,那么其他网站便可获取用户在A网站中的信息,此时若是恰好账号密码等敏感信息存于 cookie 中,此时便会有巨大的隐患。由此可见,”同源策略”是必需的,否则 Cookie 可以共享,互联网就毫无安全可言了。

同源策略的限制

虽然同源策略很有必要,但是随着互联网的发展,同源策略也越来越严格。目前如果非同源,会有下面三种行为受到限制。

  • Cookie、LocalStorage 和 IndexDB 无法读取
  • DOM 无法获得
  • AJAX 请求不能发送

同源策略的例子

URL 说明 是否允许通讯
http://www.a.com/a.js
http://www.a.com/b.js
同一域名下 允许
http://www.a.com/lab/a.js
http://www.a.com/script/b.js
同一域名下不同文件夹 允许
http://www.a.com:8000/a.js
http://www.a.com/b.js
同一域名,不同端口 不允许
http://www.a.com/a.js
https://www.a.com/b.js
一域名,不同协议 不允许
http://www.a.com/a.js
http://192.168.199.1/b.js
域名和域名对应ip 不允许
http://www.a.com/a.js
http://script.a.com/b.js
主域相同,子域不同 不允许
http://www.a.com/a.js
http://a.com/b.js
同一域名,不同二级域名(同上) 不允许(cookie这种情况下也不允许访问)
http://www.cnblogs.com/a.js
http://www.a.com/b.js
不同域名 不允许

PS:有两点比较特殊

  • 如果是协议和端口造成的跨域问题无法在前端解决
  • 在跨域问题上,域仅仅是通过”URL的首部”来识别而不会去尝试判断相同的 ip 地址对应着两个域或两个域是否在同一个 ip 上, URL首部指的是:window.location.protocol +window.location.host

同源的继承

来自about:blank,javascript:和data:URLs中的内容,继承了将其载入的文档所指定的源,因为它们的URL本身未指定任何关于自身源的信息

IE 的同源特例

在处理同源策略的问题上,IE存在两个主要的不同之处

  • 授信范围(Trust Zones):两个相互之间高度互信的域名,如公司域名(corporate domains),不遵守同源策略的限制。
  • 端口:IE未将端口号加入到同源策略的组成部分之中,
    因此 http://company.com:81/index.htmlhttp://company.com/index.html 属于同源并且不受任何限制。

这些例外是非标准的,其它浏览器也未做出支持,但会助于开发基于window RT IE的应用程序。