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请求头
OriginAccess-Control-Request-MethodAccess-Control-Request-Headers
HTTP响应头
Access-Control-Allow-OriginAccess-Control-Expose-Headers-
Access-Control-Max-Age预请求的结果有效期是多久 Access-Control-Allow-CredentialsAccess-Control-Allow-MethodsAccess-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都是使用不安全的连接设置的。