0x00000001.首先让我们明确一下相关概念:
源:源即是协议、域名和端口号。 如:https://blog.youkuaiyun.com/zzy2210:8080 就是一个源 同源:即源相同,源也就是说只要协议、域名、端口号相同便属于同源。 如:对于https://blog.youkuaiyun.com/zzy2210 http://blog.youkuaiyun.com/zzy2210 不同源,因为协议不同 https://blog.youkuaiyun.com/zzy2210:1080 不同源,因为端口不同 https://blog.youkuaiyun.com/zzy9001 同源 https://blog.net/zzy2210 不同源,因为域名不同 同源策略:同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。 即www.baidu.com下的js脚本在无授权的情况下,读取blog.youkuaiyun.com/zzy2210:8080 是会报错的。
0x00000002 例外的IE
在同源策略,ie 主要有两个不同点:
- 授信范围:(Trust Zones):两个相互之间高度互信的域名,如公司域名(corporate domains),不遵守同源策略的限制。
- 端口:IE 未将端口号加入到同源策略的组成部分之中,因此 http://company.com:81/index.html 和 http://company.com/index.html 属于同源并且不受任何限制。
0x00000003 跨域
以下知识我并未完全掌握,将慢慢补充跨域,是不同源脚本操作其他源下的对象所需要的。 跨域的实现形式有: 1.降域(双向跨域)document.domain 同源策略认为域和子域不是同一个域,但是可以通过
document.domain
这个命令来使域与子域同源。
如:
main.com与child.main.com并不同源,
但是在child.main.com中设置document.domain = 'main.com’即之由子域改为主域
2.JSOP跨域(单向跨域)
NULL
3.Ajax跨域(CORS)
NULL
4.window.postMessage(双向跨域)
NULL
5.window.name
NULL
6.location.hash
NULL
7.跨域内嵌的资源
这一点其实是因为页面中的链接、重定向以及表单提交是不会受同源策略限制。
如:
a.<script src="..."></script>标签嵌入脚本。
b.<link rel="stylesheet" href="...">标签嵌入CSS。
c.<img>嵌入图片。
d.<video> 和 <audio>嵌入多媒体资源。
e.<object>, <embed> 和 <applet>的插件。
f.@font-face引入的字体。一些浏览器允许跨域字体( cross-origin fonts),一些需要同源字体(same-origin fonts)。
g.<frame>和<iframe>载入的任何资源。站点可以使用X-Frame-Options消息头来阻止这种形式的跨域交互。