同源策略
什么是同源策略
同源策略(Same origin policy)是浏览器为了安全设置了一种机制,即在打开了多个iframe或者多个窗口的情况下,限制JavaScript代码能够访问的只有同源(同一协议、同一域名、同一端口)的iframe或者窗口。
举例
a:http://www.a.com:80(域名对应ip为http://1.1.1.1)
b:
序号 | 域名 | 端口 | 情况分析 | 是否与a同源 |
---|---|---|---|---|
1 | http://www.b.com | 8080 | 与a不同域名不同端口 | 非同源 |
2 | http://www.b.com | 80 | 与a不同域名同一端口 | 非同源 |
3 | http://www.a.com | 8080 | 与a同一域名不同端口 | 非同源 |
4 | http://a.com | 80 | 与a同一域名同一端口但不同二级域名 | 非同源 |
5 | http://1.1.1.1 | 80 | 使用与a域名对应ip以及同一端口 | 非同源 |
6 | https://www.a.com | 80 | 与a同一域名同一端口但不同协议 | 非同源 |
7 | http://www.a.com | 80 | 与a同一域名同一端口同一协议 | 同源 |
不严格的同源策略
domain
假设现在有两个窗口,窗口a和窗口b,a打开的a.example.com,b打开的是b.example.com,此时只要将这两个窗口的document.domain都设置成example.com,那么她们就可以摆脱同源策略的限制。但是这里要注意的是,domain的属性至少要保留一个点,也就是说至少要是二级域名,并且只能减去子域名,而不能修改任何域名。比如:这里的窗口a和窗口b,不能把example.com修改成example1.com或者example.cn,这样是不可以的。
跨域资源共享(CORS)
为了应对同源策略,IE8推出了XDomainRequest,而其它浏览器通过XMLHttpRequest实现了对CORS的支持。客户端将在请求头部带上Origin属性,而服务器在相应的时候会在头部加上一个Access-Control-Allow-Origin属性,浏览器将通过这两个属性是否匹配来判断是否可以CORS。
跨文档消息
浏览器允许不同文档之间传递消息,而不管其源是否相同。假如现在这里有两个窗口,窗口a和窗口b,它们现在是不同源的。此时a可以调用postMessage方法传递消息时间,b可以调用onMessage方法来接收,虽然此时a和b还是不能互相访问,但是也可以实现安全的消息通讯了。