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 相关文章推荐
Script标签与访问HTML页面详解
Jan 10 Javascript
file控件选择上传文件确定后触发的js事件是哪个
Mar 17 Javascript
JavaScript返回网页中超链接数量的方法
Apr 03 Javascript
详解webpack+angular2开发环境搭建
Jun 28 Javascript
微信小程序获取循环元素id以及wx.login登录操作
Aug 17 Javascript
vue.js 中使用(...)运算符报错的解决方法
Aug 09 Javascript
详解webpack2异步加载套路
Sep 14 Javascript
简单的React SSR服务器渲染实现
Dec 11 Javascript
详解Vue.directive 自定义指令
Mar 27 Javascript
JavaScript如何实现元素全排列实例代码
May 14 Javascript
基于JavaScript实现单例模式
Oct 30 Javascript
如何使用vue slot创建一个模态框的实例代码
May 24 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
PHP获取MAC地址的函数代码
2011/09/11 PHP
CI框架安全类Security.php源码分析
2014/11/04 PHP
thinkPHP5.0框架配置格式、加载解析与读取方法
2017/03/17 PHP
用PHP去掉文件头的Unicode签名(BOM)方法
2017/06/22 PHP
Laravel Eloquent ORM 实现查询表中指定的字段
2019/10/17 PHP
js jquery做的图片连续滚动代码
2008/01/06 Javascript
jQueryUI如何自定义组件实现代码
2010/11/14 Javascript
利用JS实现浏览器的title闪烁
2013/07/08 Javascript
js判断输入是否为数字的具体实例
2013/08/03 Javascript
js 判断文件类型并控制表单提交示例代码
2013/11/14 Javascript
浅析javascript中function 的 length 属性
2014/05/27 Javascript
Node.js中安全调用系统命令的方法(避免注入安全漏洞)
2014/12/05 Javascript
node.js中的fs.readdirSync方法使用说明
2014/12/17 Javascript
JavaScript跨浏览器获取页面中相同class节点的方法
2015/03/03 Javascript
JavaScript中的toLocaleLowerCase()方法使用详解
2015/06/06 Javascript
JavaScript控制浏览器全屏及各种浏览器全屏模式的方法、属性和事件
2015/12/20 Javascript
理解jquery事件冒泡
2016/01/03 Javascript
原生JS实现图片轮播与淡入效果的简单实例
2016/08/21 Javascript
Vue.js实现多条件筛选、搜索、排序及分页的表格功能
2020/11/24 Javascript
详解使用webpack打包编写一个vue-toast插件
2017/11/08 Javascript
如何在Vue.js中实现标签页组件详解
2019/01/02 Javascript
Vue防止白屏添加首屏动画的实例
2019/10/31 Javascript
vue项目查看vue版本及cli版本的实现方式
2020/10/24 Javascript
Python自定义scrapy中间模块避免重复采集的方法
2015/04/07 Python
利用Python将文本中的中英文分离方法
2018/10/31 Python
PIL图像处理模块paste方法简单使用详解
2019/07/17 Python
python matplotlib库绘制条形图练习题
2019/08/10 Python
PyCharm 2019.3发布增加了新功能一览
2019/12/08 Python
材料工程专业毕业生求职信
2014/03/04 职场文书
医院院务公开实施方案
2014/05/03 职场文书
反四风对照检查材料思想汇报
2014/09/16 职场文书
工作保证书怎么写
2015/02/28 职场文书
教师学期述职自我鉴定
2019/08/16 职场文书
Win7/8.1用户可以免费升级到Windows 11系统吗?
2021/11/21 数码科技
阿里云国际版 使用Nginx作为HTTPS转发代理服务器
2022/05/11 Servers
MySQL中JOIN连接的基本用法实例
2022/06/05 MySQL