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的类型简单说明
Sep 03 Javascript
JQuery each打印JS对象的方法
Nov 13 Javascript
JS中改变this指向的方法(call和apply、bind)
Mar 26 Javascript
JS中JSON对象和String之间的互转及处理技巧
Apr 06 Javascript
JavaScript轮播图简单制作方法
Feb 20 Javascript
JS 组件系列之 bootstrap treegrid 组件封装过程
Apr 28 Javascript
Vue.js上下滚动加载组件的实例代码
Jul 17 Javascript
简单实现vue验证码60秒倒计时功能
Oct 11 Javascript
jQuery实现的鼠标滚轮控制图片缩放功能实例
Oct 14 jQuery
使用ionic(选项卡栏tab) icon(图标) ionic上拉菜单(ActionSheet) 实现通讯录界面切换实例代码
Oct 20 Javascript
修改UA在PC中访问只能在微信中打开的链接方法
Nov 27 Javascript
javascript如何实现create方法
Nov 04 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
让你的WINDOWS同时支持MYSQL4,MYSQL4.1,MYSQL5X
2006/12/06 PHP
学习discuz php 引入文件的方法DISCUZ_ROOT
2009/06/21 PHP
IIS安装Apache伪静态插件的具体操作图文
2013/07/01 PHP
实现获取http内容的php函数分享
2014/02/16 PHP
php flush无效,IIS7下php实时输出的方法
2016/08/25 PHP
PHP之十六个魔术方法详细介绍
2016/11/01 PHP
PHP房贷计算器实例代码,等额本息,等额本金
2017/04/01 PHP
laravel 实现上传图片到本地和前台访问示例
2019/10/21 PHP
jquery BS,dialog控件自适应大小
2009/07/06 Javascript
javascript的数据类型、字面量、变量介绍
2012/05/23 Javascript
js中实现多态采用和继承类似的方法
2014/08/22 Javascript
Javascript字符串浏览器兼容问题分析
2014/12/01 Javascript
jQuery页面刷新(局部、全部)问题分析
2016/01/09 Javascript
js面向对象的写法
2016/02/19 Javascript
分析js闭包引起的事件注册问题
2016/03/29 Javascript
Javascript中构造函数要注意的一些坑
2017/01/23 Javascript
Angular2监听页面大小变化的解决方法
2017/10/09 Javascript
微信小程序自定义组件之可清除的input组件
2018/07/17 Javascript
使用React手写一个对话框或模态框的方法示例
2019/04/25 Javascript
实例详解带参数的 npm script
2019/05/28 Javascript
vue+elementUi图片上传组件使用详解
2019/08/20 Javascript
jQuery实现可以计算进制转换的计算器
2020/10/19 jQuery
python笔记之mean()函数实现求取均值的功能代码
2019/07/05 Python
Django 开发调试工具 Django-debug-toolbar使用详解
2019/07/23 Python
python3.8下载及安装步骤详解
2020/01/15 Python
Python 面向对象静态方法、类方法、属性方法知识点小结
2020/03/09 Python
SKECHERS官方旗舰店:美国舒适运动休闲品牌
2017/12/22 全球购物
英国儿童设计师服装的领先零售商:Base
2019/03/17 全球购物
测绘工程专业个人自我评价
2013/12/01 职场文书
写给老婆的检讨书
2014/02/21 职场文书
春节联欢晚会主持词
2014/03/24 职场文书
2014年数学教师工作总结
2014/12/03 职场文书
2015年医务科工作总结范文
2015/05/26 职场文书
2016元旦主持人开场白
2015/12/03 职场文书
教师纪律作风整顿心得体会
2016/01/23 职场文书
八年级作文之感恩
2019/11/22 职场文书