前言
跨域:协议,域名,端口完全相同的两个地址,称为同域。其它的任何两个域名称为跨域。
eg: http:baidu.com/a.html 和http:baidu.com/b.html为同域;
http:news.baidu.com 和 http:baidu.com 为跨域。
跨域的两个地址不能相互之间的访问有如下三点限制,这种限制叫同源策略。
限制
1. 不能访问操作DOM。比如通过openr访问操作另一个页面的DOM信息。
2. 不能访问资源。比如通过XMLHttpRequest或者fetch访问资源。
3. 不能访问cookie,stroage,indexDB等信息。
解释
document.domain可以显示得设置一个地址的域名,假如两个地址的协议,端口完全相同,则我们可以通过document.domain改变域名,来使得这两个url变为同源,从而达到跨域访问或者操作DOM,cookie等信息的目的。
但是document.domain的修改有两个限制:
1. 只能设置为当前页面原有的domain,可就是不变。
2. 只能设置为当前页面原有domain的上一级domain,并且设置的domain必须有‘.’;
举个例子:
http:news.baidu.com这个地址如果要修改域名,只能修改为‘news.baidu.com(满足第一条限制)’和‘baidu.com(满足第二条限制)’。而不能设置为'map.baidu.com'或者‘.com’等。
那有的朋友会问:那‘a.taobao.com’页面通过document.domain = 'taobao.com'之后,是否可以直接访问‘taobao.com’页面的资源?因为此时两个页面的domain是一样的,都是‘taobao.com’。答案是否定的。
因为如果可以的话,那任何域名的子级域名地址(a.taobao.com)都可以对父级(taobao.com)发起xss攻击。只有父子级都通过显示得设置document.domain = 'taobao.com',才能达到跨域访问资源的目的。
参考资料:
1. developer.mozilla.org/zh-CN/docs/…
2. developer.mozilla.org/zh-CN/docs/…