同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是浏览器用于隔离潜在恶意文件的一个重要安全机制。
简单讲:浏览器限制来自不同地方的资源的信息共享,最大限度的防止出现恶意行为。
源的定义
如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有相同的源。
只要有一个不一致,都被认为是非同源。
下表给出了相对http://store.company.com/dir/page.html同源检测的示例:
URL | 结果 | 原因 |
---|---|---|
http://store.company.com/dir2/other.html | 成功 | |
http://store.company.com/dir/inner/another.html | 成功 | |
https://store.company.com/secure.html | 失败 | 不同协议 ( https和http ) |
http://store.company.com:81/dir/etc.html | 失败 | 不同端口 ( 81和80) |
http://news.company.com/dir/other.html | 失败 | 不同域名 ( news和store ) |
限制网络访问
同源策略会限制网络访问。
同源策略下只允许到不同源发送Post和Get请求,不允许发送Put和Delete请求。也不允许向不同的源发送自定义header,向自己的源发送自定义header是允许的。
但是,并不是完全这样。<script>标签访问的目标源的文件没有做限制,JSONP即是基于此而实现的。为了提高安全性,浏览器需要读取Access-Control-Allow-Origin:*,来确定源是否安全。
对浏览器存储的限制
存储在浏览器中的数据,如localStorage和IndexedDB,以源进行分割。每个源都拥有自己单独的存储空间,一个源中的Javascript脚本不能对属于其它源的数据进行读写操作。
Cookies 使用不同的源定义方式。一个页面可以为本域和任何父域设置cookie,只要是父域不是公共后缀(public suffix)即可。Firefox 和 Chrome 使用 Public Suffix List 决定一个域是否是一个公共后缀(public suffix)。Internet Explorer使用其自己的内部方法来确定域是否是公共后缀。不管使用哪个协议(HTTP/HTTPS)或端口号,浏览器都允许给定的域以及其任何子域名(sub-domains) 访问 cookie。设置 cookie 时,你可以使用Domain,Path,Secure,和Http-Only标记来限定其访问性。读取 cookie 时,不会知晓它的出处。 即使您仅使用安全的https连接,您看到的任何cookie都可能使用不安全的连接进行设置。