layout: post title: Js跨域 category: Javascript tags: [JavaScript] —

看到周围同事代码有跨域,同时为了应聘,就了解下

看了JavaScript跨域总结与解决办法(内容已备份至有道笔记),总结如下 ##跨域风险、同源策略(犀牛书说法) 绕过防火墙,将Js加载到你浏览的页面,Js再open个window,你一不小心,在里面浏览文件,文件就泄密了。现在有了个同源策略,IE浏览器让你选择是否允许跨域,而其它浏览器默认不允许。 >绕过防火墙:比如,在东北上网时,浏览网页的恶心广告,它们就是绕过防火墙进来的。

##跨域概念理解 1. 跨域一般指的是在访问iframe中内容的Dom或Js变量时出现的;不支持跨域,指的是:还有父页面不能访问iframe,iframe也不能访问父页面。 比如想访问iframe页面的window和document,测试发现,document.getElementByTagname('iframe')[0].contentWindow对象的值为空,当然对象的document对象根本就不能访问。

  1. XMR也有跨域问题,情形与上面一样。

补充下域名知识,一级域名类似:sprying.com;二级域名:www.sprying.com

##解决方法: 1.都是在一个主域名情况下,设置两页面(父页面,iframe)document.domain为一级域名

2.通过script,感觉作用不大,不能传参。返回的数据格式只能是Json,比如script返回

var remote={test:’hello’};
var f=[2,1];

思考:针对不同的类似?type=’v1’ 这类请求是否能返回不同的内容,有待研究。

3、iframe与location.hash,涉及三个页面,父页面通过hash访问一级iframe,一级iframe通过hash返回数据岛二级iframe,二级iframe页面中,

parent.parent.location.hash = self.location.hash.substring(1); 4、window.name

5、postMessage IE8+ 比如我的gitHub使用多说插件,在Js中看到postMessage

6、利用flash

##全浏览器支持方案 1、postMessage + flash

2、postMessage + opener hack opener hack 是针对 ie6和ie7的. ie8+就支持postMessage了.所以作为补充还是不错的选择.

即: 在父页面设置 子页面的窗口句柄.opener = function(){}; 或者 {};

子页面就可以用 opener.method(); 或者 new opener()的方式跨域调用父页的方法了.同样的.子页面可以在需要的时候.通过此接口.把自身的对象或方法给父页.则父页同样也可以方便的直接调用子页的资源

这是google的工程师率先发现的ie6 7的漏洞. 介于ie6 7不打算修补这个漏洞的事实.所以可以作为跨域通信的解决方案之一. 但要妥善用之.否则有很大安全隐患.