layout: post title: Js跨域 category: Javascript tags: [JavaScript] —
看了JavaScript跨域总结与解决办法(内容已备份至有道笔记),总结如下 ##跨域风险、同源策略(犀牛书说法) 绕过防火墙,将Js加载到你浏览的页面,Js再open个window,你一不小心,在里面浏览文件,文件就泄密了。现在有了个同源策略,IE浏览器让你选择是否允许跨域,而其它浏览器默认不允许。
绕过防火墙:比如,在东北上网时,浏览网页的恶心广告,它们就是绕过防火墙进来的。
##跨域概念理解
-
跨域一般指的是在访问iframe中内容的Dom或Js变量时出现的;不支持跨域,指的是:还有父页面不能访问iframe,iframe也不能访问父页面。 比如想访问iframe页面的window和document,测试发现,
document.getElementByTagname('iframe')[0].contentWindow
对象的值为空,当然对象的document
对象根本就不能访问。 -
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不打算修补这个漏洞的事实.所以可以作为跨域通信的解决方案之一. 但要妥善用之.否则有很大安全隐患.