1. 概述
1.1 含义
1995年,同源政策由 Netscape 公司引入浏览器。目前,所有浏览器都实行这个策略。
同源策略是指:如果两个 URL 的 protocol、host 和 port (如果有指定的话)都相同的话,则这两个 URL 是同源。
举例来说:http://www.example.com/index.html
,在这个URL中 协议(protocol)是http
;域名是www.example.com
;端口是80(http协议默认端口)
。
下表给出了与 URL http://www.example.com/index.html 的源进行对比的示例:
URL | 结果 | 原因 |
---|---|---|
http://www.example.com/src/one.html | 同源 | 协议、域名、端口均相同 |
https://www.example.com/two.html | 不同源 | 协议不同 |
http://www.complex.com/three.html | 不同源 | 域名不同 |
http://www.example.com:81/four.html | 不同源 | 端口不同 |
1.2 目的
同源政策的目的,是为了保证用户信息的安全,防止恶意的网站窃取数据。
浏览器的同源策略,限制了来自不同源的“document ” 1 或脚本,对当前“document”读取或设置某些属性。
同源策略极其重要,试想如果没有同源策略,可能 a.com 的一段 JavaScript 脚本,在 b.com 未曾加载此脚本时,也可以随意涂改 b.com 的页面(在浏览器的显示中)。为了不让浏览器的页面行为发生混乱,浏览器提出了“Origin”(源)这一概念,来自不同 Origin的对象无法互相干扰。
1.3 限制范围
随着互联网的发展,"同源政策"越来越严格。目前,如果非同源,共有三种行为受到限制。
- Cookie、LocalStorage 和 IndexDB 无法读取。
- DOM 无法获得。
- AJAX 请求不能发送(可以发送,但浏览器会拒绝接受响应)。
2. 进阶
2.1 JavaScript 的源( Origin )
对于当前页面来说,页面存放 JavaScript 文件的域并不重要,重要的是加载 JavaScript 页面所在的域是什么。
例如:
a.com通过以下代码:
<script src=http://www.b.com/b.js></script>
加载了 b.com 上的 b.js,但是b.js是运行在 a.com 页面中的,因此相对于当前打开的页面( a.com )来说,b.js 的源就应该是 a.com 而非 b.com。
2.2 XMLHttpRequest
2.3 其他
对于浏览器来说,除了DOM、Cookie、XMLHttpRequest 会受到同源策略的限制外,浏览器加载的一些第三方插件也有各自的同源策略。最常见的一些插件如 Flash、Java Applet、Sliverlight、Google Gears等都有自己的控制策略。
以 Flash 为例,它主要通过网站提供的 crossdomain.xml 文件判断是否允许当前 “源” 的 Flash 跨域访问目标资源。
每个载入浏览器的 HTML 文档都会成为 Document 对象。Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问。 ↩︎