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 动态添加表格行 使用模板、标记
Oct 24 Javascript
JQUERY获取form表单值的代码
Jul 17 Javascript
Javascript类定义语法,私有成员、受保护成员、静态成员等介绍
Dec 08 Javascript
仿新浪微博登陆邮箱提示效果的js代码
Aug 02 Javascript
IE6中链接A的href为javascript协议时不在当前页面跳转
Jun 05 Javascript
javascript小数精度丢失的完美解决方法
May 31 Javascript
js中遍历Map对象的方法
Jul 27 Javascript
AngularJS中的DOM操作用法分析
Nov 04 Javascript
Vue数组更新及过滤排序功能
Aug 10 Javascript
Vue组件创建和传值的方法
Aug 17 Javascript
JavaScript简易计算器制作
Jan 17 Javascript
vue项目实现减少app.js和vender.js的体积操作
Nov 12 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
优化使用mysql存储session的php代码
2008/01/10 PHP
PHP ajax 分页类代码
2008/11/13 PHP
php设计模式 Interpreter(解释器模式)
2011/06/26 PHP
PHP错误和异常处理功能模块示例
2016/11/12 PHP
老生常谈php 正则中的i,m,s,x,e分别表示什么
2017/03/02 PHP
利用Homestead快速运行一个Laravel项目的方法详解
2017/11/14 PHP
Yii 框架使用Forms操作详解
2020/05/18 PHP
文本链接逐个出现的js脚本
2007/12/12 Javascript
jQuery中操控hidden、disable等无值属性的方法
2014/01/06 Javascript
AngularJS + Node.js + MongoDB开发的基于高德地图位置的通讯录
2015/01/02 Javascript
JavaScript运动减速效果实例分析
2015/08/04 Javascript
js识别uc浏览器的代码
2015/11/06 Javascript
Javascript打印局部页面实例
2016/06/21 Javascript
关于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法
2016/06/30 Javascript
详解JavaScript中js对象与JSON格式字符串的相互转换
2017/02/14 Javascript
jQuery插件jqGrid动态获取列和列字段的方法
2017/03/03 Javascript
详解vue2.0的Element UI的表格table列时间戳格式化
2017/06/13 Javascript
js 获取元素的具体样式信息getcss(实例讲解)
2017/07/05 Javascript
Vue-cli中为单独页面设置背景色的实现方法
2018/02/11 Javascript
使用layui 渲染table数据表格的实例代码
2018/08/19 Javascript
ionic+html5+API实现双击返回键退出应用
2019/09/17 Javascript
微信小程序实现页面浮动导航
2020/01/08 Javascript
Vue axios与Go Frame后端框架的Options请求跨域问题详解
2020/03/03 Javascript
Nuxt的路由配置和参数传递方式
2020/11/06 Javascript
vue 数据双向绑定的实现方法
2021/03/04 Vue.js
Python利用多进程将大量数据放入有限内存的教程
2015/04/01 Python
python使用pipeline批量读写redis的方法
2019/02/18 Python
python3格式化字符串 f-string的高级用法(推荐)
2020/03/04 Python
Python3如何使用多线程升程序运行速度
2020/08/11 Python
Python编写memcached启动脚本代码实例
2020/08/14 Python
手把手教你用纯css3实现轮播图效果实例
2017/05/04 HTML / CSS
医学生职业规划范文
2014/01/05 职场文书
夜不归宿检讨书
2014/02/25 职场文书
重阳节活动总结
2014/08/27 职场文书
学生检讨书
2015/01/27 职场文书
Python Django / Flask如何使用Elasticsearch
2022/04/19 Python