含义
同源即协议、域名、端口相同。
http://www.example.com/login/index.html
协议:http://
域名:www.example.com
端口:80(默认端口)
只要保证以上3个数据相同就是同源。
同源策略限制了从同一个源加载的文档或脚本与来自另一个源的资源进行交互。
这是一个用于隔离潜在恶意文件的重要安全机制。
当涉及同源策略时,IE有两点不同:
授信范围:两个相互之间高度互信的域名不遵守同源策略的限制;
IE仅需协议和域名相同即认为是同源,不需要考虑端口。
同源共享
- cookie:同源可共享cookie。浏览器也允许通过document.domain=xxx.com来设置共享cookie。比如网易账号中心A和163网易免费邮B属于不同源,但登录了A后,再登录B不用重新登录。但是通过这种方式,端口号会被改成null。因此company.com:8080不能仅仅通过设置该页面的document.domain=company.com,应该把company.com也改成document.domain=company.com。这样company.com:8080和company.com的端口号就都为null了。此时他们才同源。
- iframe:如果iframe窗口和父窗口不是同源,就无法拿到对方的DOM。myIframeElement.contentWindow.document就会报错。同理,在子窗口中window.parent.document也会报错。规避方法:document.domain;片段识别符;window.name;跨文档通信API postMessage。具体可参见(http://www.ruanyifeng.com/blog/2016/04/same-origin-policy.html)
- ajax:不同的域,ajax是无法请求的。ajax要想解决域的信息可以用:JSONP、WebSocket、CORS(跨域资源共享)
源的继承
about:blank javascript:URL data:URLs 这样的伪协议创建无需服务器内容的HTML页面,这些页面的数据完全来自于客户端。完全不同的域创建的about:blank文档属于同源的页面。
从页面执行的脚本会继承打开它的页面的源。因为这些类型的URL没有明确包含有关原始服务器的信息。
跨源网络访问
以下是可以嵌入跨源资源的示例:
- <script src="XXX"></script>
- <link rel="stylesheet" href="XXX"> css需设置正确的Content-Type消息头text/css
- <img>、<video>、<audio>
- <object>、<embed>、<applet>的插件
- @font-face引入的字体(一些浏览器允许跨域字体,一些需要同源字体)
- <frame>、<iframe>载入的任何资源。站点可以用X-Frame-Options消息头来阻止这种跨域。
阻止跨源访问
未完
参考:
https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy