JS防止网页被嵌入iframe框架的方法分析


Posted in Javascript onSeptember 13, 2016

本文实例讲述了JS防止网页被嵌入iframe框架的方法。分享给大家供大家参考,具体如下:

例如:

<script type="text/javascript">
  if (window!=top) // 判断当前的window对象是否是top对象
  top.location.href = window.location.href; // 如果不是,将top对象的网址自动导向被嵌入网页的网址
</script>

这段代码是有效的。但是,有一个问题:使用后,任何人都无法再把你的网页嵌入框架了,包括你自己在内。

于是,我今天就在考虑,有没有一种方法,使得我的网页只能被嵌入我自己的框架,而不是别人的框架?

表面上看,这个问题很简单。只要做一个判断:当前框架和顶层框架的域名是否相同,如果答案是否,就做了一个URL重定向。

if (top.location.hostname != window.location.hostname) {
  top.location.href = window.location.href;
}

但是,出乎意料的是,这样写是错误的,根本无法运行。你能看出,错在哪里吗?

假定 top.location.hostname 是 www.111.com,而 window.location.hostname 是 www.222.com。也就是说,111.com把222.com嵌入了它的网页中。这时,比较 top.location.hostname != window.location.hostname 会有什么结果?

浏览器会提示代码出错!

因为它们跨域(cross-domain)了,浏览器的安全政策不允许222.com的网页操作111.com的网页,反之亦然。IE把这种错误叫做"没有权限"。进一步说,浏览器甚至不允许你查看top.location.hostname,跨域情况下,一看到这个对象,就直接报错。

那么,代码应该如何修改?

事实上,这提示我们,只要查看top.location.hostname是否报错就可以了。如果报错了,表明存在跨域,就对top对象进行URL重导向;如果不报错,表明不存在跨域(或者未使用框架),就不采取操作。

try{
  top.location.hostname;
}catch(e){
  top.location.href = window.location.href;
}

这样写已经正确了,在IE和Firefox中可以正确运行。但是,Chrome浏览器会出现错误,不知为何,在跨域情况下,Chrome对top.location.hostname不报错!

没办法,只能为了Chrome,再加一段补充代码。

try{
  top.location.hostname;
  if (top.location.hostname != window.location.hostname) {
    top.location.href =window.location.href;
  }
}catch(e){
  top.location.href = window.location.href;
}

好了,升级版代码完成。除了本地域名以外,其他域名一律无法将你的网页嵌入框架。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
基于jQuery实现表格数据的动态添加与统计的代码
Jan 31 Javascript
jquery设置控件位置的方法
Aug 21 Javascript
javascript学习笔记(八)正则表达式
Oct 08 Javascript
浅析JavaScript中的事件机制
Jun 04 Javascript
使用AmplifyJS组件配合JavaScript进行编程的指南
Jul 28 Javascript
原生js制作日历控件实例分享
Apr 06 Javascript
js删除Array数组中指定元素的两种方法
Aug 03 Javascript
js中动态创建json,动态为json添加属性、属性值的实例
Dec 02 Javascript
JavaScript循环_动力节点Java学院整理
Jun 28 Javascript
Element中的Cascader(级联列表)动态加载省\市\区数据的方法
Mar 27 Javascript
小程序getLocation需要在app.json中声明permission字段
Apr 04 Javascript
axios封装,使用拦截器统一处理接口,超详细的教程(推荐)
May 02 Javascript
javascript数组遍历的方法实例分析
Sep 13 #Javascript
jQuery弹出遮罩层效果完整示例
Sep 13 #Javascript
JS简单去除数组中重复项的方法
Sep 13 #Javascript
jQuery包裹节点用法完整示例
Sep 13 #Javascript
jQuery查找节点方法完整实例
Sep 13 #Javascript
jQuery表单对象属性过滤选择器实例详解
Sep 13 #Javascript
jQuery实现的放大镜效果示例
Sep 13 #Javascript
You might like
DC游戏Steam周三特惠 《蝙蝠侠》阿卡姆系列平史低
2020/04/09 欧美动漫
详解php中反射的应用
2016/03/15 PHP
网络图片延迟加载实现代码 超越jquery控件
2010/03/27 Javascript
原生Js与jquery的多组处理, 仅展开一个区块的折叠效果
2011/01/09 Javascript
jquery数据验证插件(自制,简单,练手)实例代码
2013/10/24 Javascript
JQuery 图片滚动轮播示例代码
2014/03/24 Javascript
JS与jQ读取xml文件的方法
2015/12/08 Javascript
AngularJS基础 ng-mouseover 指令简单示例
2016/08/02 Javascript
js+css3实现旋转效果
2017/01/20 Javascript
bootstrap 点击空白处popover弹出框隐藏实例
2018/01/24 Javascript
JavaScript基础心法 深浅拷贝(浅拷贝和深拷贝)
2018/03/05 Javascript
React.js绑定this的5种方法(小结)
2018/06/05 Javascript
解决vue select当前value没有更新到vue对象属性的问题
2018/08/30 Javascript
解决微信小程序防止无法回到主页的问题
2018/09/28 Javascript
[03:09]2014DOTA2国际邀请赛 赛场上的美丽风景线 中国Coser也爱DOTA2
2014/07/20 DOTA
[53:43]VP vs NewBee Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
Python中的生成器和yield详细介绍
2015/01/09 Python
python简单程序读取串口信息的方法
2015/03/13 Python
Python PyQt5实现的简易计算器功能示例
2017/08/23 Python
python中退出多层循环的方法
2018/11/27 Python
python实现植物大战僵尸游戏实例代码
2019/06/10 Python
Python的log日志功能及设置方法
2019/07/11 Python
Python二维数组实现求出3*3矩阵对角线元素的和示例
2019/11/29 Python
python图形开发GUI库pyqt5的基本使用方法详解
2020/02/14 Python
python 安装库几种方法之cmd,anaconda,pycharm详解
2020/04/08 Python
CSS3 3D制作实战案例分析
2016/09/18 HTML / CSS
世界上最大的艺术和工艺用品商店:MisterArt.com
2018/07/13 全球购物
爱尔兰最大的体育零售商:Life Style Sports
2019/06/12 全球购物
俄罗斯香水在线商店:AromaCode
2019/12/04 全球购物
AJAX应用和传统Web应用有什么不同
2013/08/24 面试题
房地产项目策划书
2014/02/05 职场文书
租房协议书怎么写
2014/04/10 职场文书
倡议书范文
2014/04/16 职场文书
学术会议通知范文
2015/04/15 职场文书
迎新生欢迎词2015
2015/07/16 职场文书
创业计划书之游泳馆
2019/09/16 职场文书