当前位置:网站首页 > 技术博客 > 正文

iframe跨域操作



注:跨域的知识点详见:

目录

实验验证环境配置:

1、利用document.domain降域

方法1:

方法2:

2、利用location.hash

3、利用window.name

4、利用postMessage(最推荐)

使用postmessage实现跨域访问

使用postmessage读取其他窗口的localstorage(普通款)

使用postmessage读取其他窗口的localstorage(加强版本):


我们一共需要配置五个虚拟主机,即需要使用五个域名

www.aaa.com、www.bbb.com、master.security.com、slave.security.com、www.security.com

(1)在本地的WWW目录下创建两个文件夹

cross_orgin和cross_orgin_sub

(2)域名分配:

cross_orgin:www.aaa.com

cross_orgin_sub:www.bbb.com

为了方便我们访问,这里需要在本地配置虚拟主机

(3)虚拟主机:

 
   

 这里配置了两个虚拟主机:www.aaa.com 和 www.bbb.com分别对应的是我们所配置的

cross_orgin和cross_orgin_sub两个目录文件夹

(4)在vhost中配置ip与域名的对应关系

然后我们需要在本地环境的C:WindowsSystem32driversetc 目录下的vhost文件中增加对应关系

 
   

(5)我们可以在 cross_orgin和cross_orgin_sub 文件夹中任意创建页面文件,然后尝试使用域名进行访问

如果使用域名访问看到了编辑的页面内容,说明我们的环境已经搭建好了。

下面就详细的介绍一下ifame实现跨域DOM互访问的四种方式:

(6)

然后使用上面同样的方式完成master.security.com和slave.security.com和www.security,com这三个域名的搭建

这三个域名对应的是本地的cookie_orgin和cookie_orgin_sub、CSSinject文件夹

这里就只提供这三个域名的虚拟主机配置文件:

 
   

注:虚拟主机中的目录文件需要与自己本地的文件配置一致,不要直接使用我这个 

方法1:

master.security.com 的index.html文件:

 
   

这里将slave.security通过iframe嵌入到当前页面,并且这里在script标签中设置了document.domain,目的是让同样设置了这样的页面可以跨域互访,并还设置了一个document.cookie用于测试

 
   

slave.security.com的index.html文件 : 

 
   

这里就是我们用来测试的页面与前面一样设置了document.domain,并且尝试弹出第一个文件设置的cookie值 

将文件创建后以后,我们可以尝试使用访问一下slave.security.com测试:

可以看到这里确实弹出了cookie,但是并不是文件1中设置的cookie,所以这种方法并没有实现真正的跨域互访DOM

方法2:

master.security.com 的index.html文件 :

 
   

这里和方法1一样设置了document.domain,但是不同的是,这里使用onload事件,必须要等到ifame加载完成后,在执行子页面的内容,然后这里还尝试将子页面的data尝试弹窗显示出来 

slave.security.com 的index.html文件:

 
   

这里也是设置了与前面相同document.doamin,与方法1不同的是,这里没有了弹窗,反而定义了一全局变量 

然后我们就可以尝试访问matser.security.com测试:

可以看到成功的弹窗了,并且弹出阿里data的值正是子页面定义的值,所以这里成功利用domain降域实现了跨域DOM互访

总:方法1在这个实验在浏览器中已经无法实现了,方法2可以正常实现

(1)aaa.com(index.html文件)

 
   

这里首先将www.bbb.com子页面引入到本页面,并且增加一个锚点data,然后checkHash函数中进行了异常处理,try中对data进行判断,判断这是不是一个location.hash,如果是则取出#后的数据,不是就置为空,然后打印出data的数据 

后面再进行了对hashchange的监听

(2)bbb.com(index.html文件)

 
   

 这里对location.hash进行判断,如果是#data则调用回调函数,回调函数中对data进行了赋值,并且将该值赋值给了父级的location.hash,然后后面利用了c.html作为中间代理页面,将data值传给父级

(3)中间代理c.html文件

 
   

这里就是将自己的location.hash中后面#中的值,赋值给父级的父级也就是bbb.com的父级aaa.com 

(4)测试

我们尝试访问一下www.aaa.com

可以看到我们成功的使用c.html作为中间代理,使用www.aaa.com访问到了www.bbb.com中的值,实现了跨域DOM互访的目的

缺点:

  • 数据直接暴露在URL中
  • 数据容量和类型都有限

总:这种方法已经被淘汰了

windows.name(一般在js代码中出现)的值不是一个普通的全局变量,而是当前窗口的名字,要注意的是每个iframe都有包裹它的window,而这个window是top window的子窗口,而它自然也有window.name的属性。

window.name的属性的神奇之处就在于name的值在不同的页面(甚至不同的域名)加载后依然存在(如果没有修改则值不会变化),并且可以支持非常长的name值(2MB)

举一个简单的例子:你在某个页面的控制台输入:

 
   

页面跳转到了百度的页面,但是window.name却被保留下来,还是hello world

那么我们现在可以利用window.name这一性质来尝试进行跨域访问

(1)security.com(window_name.html)

 
   

这里的windo_name.html文件中使用iframe将www.aaa.com作为子页面引入到当前页面,然后使用加载时间,来获取当前页面的,window.name值,并且打印出来,后面还指定了监听源为:www.security.com/c.html 

(2)www.aaa.com(index.html)

 
   

这里只需要定义一个window.name即可 

(7)c.html

(8)测试

可以看到这里成功的访问到了www.aaa.com中定义的window.name的值,并且,当前的Window.name的值为' '

总:当www.security.com/window_name.html在请求远端服务器www.aaa.com的数据时,我们可以在该页面下新建一个iframe,该iframe的src属性指向服务器地址(利用iframe标签的跨域能力),服务器文件aaa.com设置好了window.name值

但是由于window_name页面与aaa.com页面的iframe的src不同源的话,则无法操作iframe里面的任何东西,所以就取不到iframe的name值,所以我们只需要在aaa.com加载完成后重新换一个src指向同一个源的html文件,或者设置about:blank都行,这时候我们只要在window_name相同的目录下创建一个c.html空白文件即可,如果不重新指定src的话直接获取window.name就会报错

注:以上的方式均属于hack

使用postmessage实现跨域访问

(1)security.com

 
   

这里使用了一个事件监听着一个函数,函数中的tarOrigin指向www.aaa.com,这里表示为发送消息的接收地址,后面使用Postmessage向aaa.com发送消息,后面监听了消息这个事件 

(2)aaa.com

方案1:   
 
   

 这里定义了一个监听事件,监听消息,如果消息的源不是父级传递来的,则直接返回,否则将父级消息赋值给data,并且打印出来,然后后面也使用了postmessage向www.security发送消息

方案2: 
 
   

这里的实现是使用了event的几个属性来实现的 

(3)测试

方案1:

可以看到,www.aaa.com和www.security.com都互相收到了跨域发送的消息

方案2:

这里可以看到www.security也成功的接收到了ww.aaa发送的消息

使用postmessage读取其他窗口的localstorage(普通款)

(1)security/index.html

 
   

(2)aaa.com/index.html

 
   

(3)测试

可以看到,aaa.com页面成功使用postmessage读取到了security.com页面中的数据,并且存储到了本地

使用postmessage读取其他窗口的localstorage(加强版本):

(1)security/index.html

 
   

这里的大致思路和上面一样,那为什么说它是一个加强版本呢,因为,这里我们可以自己选择时set、还是get、还是remove Messageage发送的消息 

需要注意的是,要想让数据存储下来,需要将remove注释掉,否则将无法正常的读取到数据

(2)aaa.com/index.html

 
   

这里也是增加了set、get、remove的选项看,并且完成了对应操作的实现 

(3)测试

这里也是一样的,可以看到,aaa.com页面成功使用postmessage读取到了security.com页面中的数据,并且存储到了本地

注:如果在将数据存入数据中没有转换/存储时转换为JSON格式时会报错

到这里使用iframe实现跨域DOM互访的几种方法已经介绍完毕了,更多跨域的内容请看下篇分享

版权声明


相关文章:

  • ldap服务器部署2025-05-26 09:01:03
  • dnn和dbn2025-05-26 09:01:03
  • stm32 usb驱动开发2025-05-26 09:01:03
  • ce认证发证机构2025-05-26 09:01:03
  • knn算法是什么意思2025-05-26 09:01:03
  • spring aop怎么实现的2025-05-26 09:01:03
  • 执行语句select(1=1)or(9>10)2025-05-26 09:01:03
  • 蒙特卡洛树算法2025-05-26 09:01:03
  • 电脑键盘快捷键使用大全表2025-05-26 09:01:03
  • 相似度计算方法2025-05-26 09:01:03