brower-same-origin-policy-and-cross-origin-http-request
[toc]
同源策略
是一种约定,他是浏览器最核心也是最基本的安全功能。
两个页面拥有相同的协议、端口、和主机那么这两个页面就属于同源,当然了IE有例外
- 两个互相之间高度互信的域名,如公司域名(corporate domains),不遵守同源策略的限制
- 端口:IE未将端口号加入到同源策略的组成部分。
在同源策略中有一个例外,脚本可以设置 document.domain
的值为当前域的一个后缀,如果这样做的话,短的域将作为后续同源检测的依据。例如,假设在 http://store.company.com/dir/other.html
中的一个脚本执行了下列语句:
document.domain = "company.com";
这条语句执行之后,页面将会成功地通过对 http://company.com/dir/page.html
的同源检测。
使用document.domain是让子域访问其父域,需要同时将子域和父域的document.domain设置为相同的值。必须要这么做,即使是简单的将父域设置为其原来的值。没有这么做的话可能导致授权错误。
跨域内嵌的资源
- script
- link
- img
- video和audio
- object,embed,applet
- @font-face
- frame和iframe
实现跨域访问
使用CORS来实现跨域访问
- 简单请求,只需要设置
Access-Control-Allow-Origin: *
- 预请求
- 附带凭证信息的请求
xml.withCredentials = true;
如果服务器端的响应中,如果没有返回Access-Control-Allow-Credentials: true
的响应头,那么浏览器将不会把响应结果传递给发出请求的脚步程序,以保证信息的安
使用跨域内嵌资源实现
- JSONP
- iframe
- window.name
- document.domain
- location.hash
- window.postMessage
参考资料
HTTP请求头
Origin
Access-Control-Request-Method
Access-Control-Request-Headers
HTTP响应头
Access-Control-Allow-Origin
Access-Control-Expose-Headers
-
Access-Control-Max-Age
预请求的结果有效期是多久 Access-Control-Allow-Credentials
Access-Control-Allow-Methods
Access-Control-Allow-Headers
跨域脚本API和跨域数据存储访问
-
iframe.contentWindow
,window.parent
,window.open
,window.opener
允许文档之间相互引用,当两个文档的源不同时,这些引用方式将受到影响。可使用window.postMessage
作为替代方案。 -
localStorage
和indexedDB
每个源拥有单独空间,不能跨域做读写操作。 -
window.name
属性可以用来临时存储数据,支持跨域访问。 -
Cookies
使用不同的源定义方式。一个页面可以为本域和任何父域设置cookie,只要是父域不是公共后缀(public suffix)即可。Firefox和Chrome使用Public Suffix List决定一个域是否是一个公共后缀(public suffix)。不管使用哪个协议(HTTP/HTTPS)或端口号,浏览器都允许给定的域以及其任何子域名(sub-domains)来访问cookie。设置cookie时,你可以使用Domain,Path,Secure,和Http-Only标记来限定其访问性。读取cookie时,不会知晓它的出处。尽管使用安全的https连接,任何可见的cookie都是使用不安全的连接设置的。