同源策略 ======================================== 简介 ---------------------------------------- 同源策略限制了不同源之间如何进行资源交互,是用于隔离潜在恶意文件的重要安全机制。 是否同源由URL决定,URL由协议、域名、端口和路径组成,如果两个URL的协议、域名和端口相同,则表示他们同源。 file域的同源策略 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 在之前的浏览器中,任意两个file域的URI被认为是同源的。本地磁盘上的任何HTML文件都可以读取本地磁盘上的任何其他文件。 从Gecko 1.9开始,文件使用了更细致的同源策略,只有当源文件的父目录是目标文件的祖先目录时,文件才能读取另一个文件。 cookie的同源策略 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ cookie使用不同的源定义方式,一个页面可以为本域和任何父域设置cookie,只要是父域不是公共后缀(public suffix)即可。 不管使用哪个协议(HTTP/HTTPS)或端口号,浏览器都允许给定的域以及其任何子域名访问cookie。设置 cookie时,可以使用 ``domain`` / ``path`` / ``secure`` 和 ``http-only`` 标记来限定其访问性。 所以 ``https://localhost:8080/`` 和 ``http://localhost:8081/`` 的Cookie是共享的。 Flash/SilverLight跨域 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 浏览器的各种插件也存在跨域需求。通常是通过在服务器配置crossdomain.xml,设置本服务允许哪些域名的跨域访问。 客户端会请求此文件,如果发现自己的域名在访问列表里,就发起真正的请求,否则不发送请求。 源的更改 ---------------------------------------- 同源策略认为域和子域属于不同的域,例如 ``child1.a.com`` 与 ``a.com`` / ``child1.a.com`` 与 ``child2.a.com`` / ``xxx.child1.a.com`` 与 ``child1.a.com`` 两两不同源。 对于这种情况,可以在两个方面各自设置 ``document.domain='a.com'`` 来改变其源来实现以上任意两个页面之间的通信。 另外因为浏览器单独保存端口号,这种赋值会导致端口号被重写为 ``null`` 。 跨源访问 ---------------------------------------- 同源策略控制了不同源之间的交互,这些交互通常分为三类: + 通常允许跨域写操作(Cross-origin writes) + 链接(links) + 重定向 + 表单提交 + 通常允许跨域资源嵌入(Cross-origin embedding) + 通常不允许跨域读操作(Cross-origin reads) 可能嵌入跨源的资源的一些示例有: + ```` 标签嵌入跨域脚本。语法错误信息只能在同源脚本中捕捉到。 + ```` 标签嵌入CSS。由于CSS的松散的语法规则,CSS的跨域需要一个设置正确的Content-Type 消息头。 + ```` / ``