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 相关文章推荐
Javascript String.replace的妙用
Sep 08 Javascript
JavaScript 函数惰性载入的实现及其优点介绍
Aug 12 Javascript
JQuery Highcharts 动态生成图表的方法
Nov 15 Javascript
5个JavaScript经典面试题
Oct 13 Javascript
node.js中的path.extname方法使用说明
Dec 09 Javascript
基于jQuery1.9版本如何判断浏览器版本类型
Jan 12 Javascript
JavaScript实现字符串与日期的互相转换及日期的格式化
Mar 07 Javascript
详解Vue 动态添加模板的几种方法
Apr 25 Javascript
解决BootStrap Fileinput手机图片上传显示旋转问题
Jun 01 Javascript
react开发教程之React 组件之间的通信方式
Aug 12 Javascript
微信小程序文章详情页面实现代码
Sep 10 Javascript
Vue中import from的来源及省略后缀与加载文件夹问题
Feb 09 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
海贼王:最美的悬赏令!
2020/03/02 日漫
推荐文章系统(一)
2006/10/09 PHP
PHP设计模式之数据访问对象模式(DAO)原理与用法实例分析
2019/12/12 PHP
tp5.1 框架查询表达式用法详解
2020/05/25 PHP
javascript 简单高效判断数据类型 系列函数 By shawl.qiu
2007/03/06 Javascript
jquery中交替点击事件的实现代码
2014/02/14 Javascript
使用jQuery时Form表单元素ID和name命名大忌
2014/03/06 Javascript
JavaScript简单实现鼠标移动切换图片的方法
2016/02/23 Javascript
jQuery 全选 全部选 反选 实现代码
2016/08/17 Javascript
js代码延迟一定时间后执行一个函数的实例
2017/02/15 Javascript
JS中正则表达式全局匹配模式 /g用法详解
2017/04/01 Javascript
JavaScript中使用webuploader实现上传视频功能(demo)
2017/04/10 Javascript
写给小白看的JavaScript异步
2017/11/29 Javascript
Bootstrap popover 实现鼠标移入移除显示隐藏功能方法
2018/01/24 Javascript
JS实现为动态添加的元素增加事件功能示例【基于事件委托】
2018/03/21 Javascript
Angular5给组件本身的标签添加样式class的方法
2018/04/07 Javascript
vue点击input弹出带搜索键盘并监听该元素的方法
2018/08/25 Javascript
[00:27]DOTA2战队VP、Secret贺新春
2018/02/11 DOTA
python重试装饰器示例
2014/02/11 Python
Python黑魔法Descriptor描述符的实例解析
2016/06/02 Python
Python实现的简单模板引擎功能示例
2017/09/02 Python
Python实现的朴素贝叶斯分类器示例
2018/01/06 Python
如何实现删除numpy.array中的行或列
2018/05/08 Python
Python符号计算之实现函数极限的方法
2019/07/15 Python
python3 使用Opencv打开USB摄像头,配置1080P分辨率的操作
2019/12/11 Python
什么是python的列表推导式
2020/05/26 Python
林清轩官方网站:山茶花润肤油开创者
2016/10/26 全球购物
Ralph Lauren意大利官方网站:时尚界最负盛名的品牌之一
2018/10/18 全球购物
英国行业制服供应商:Alexandra
2019/09/14 全球购物
自荐信包含哪些内容
2013/10/30 职场文书
测控技术与仪器个人求职信范文
2013/12/30 职场文书
初中学校军训方案
2014/05/09 职场文书
党员学习新党章思想汇报
2014/10/25 职场文书
法律意见书范文
2015/06/04 职场文书
2019年冬至:天冷暖人心的问候祝福语大全
2019/12/20 职场文书
springboot 全局异常处理和统一响应对象的处理方式
2022/06/28 Java/Android