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.autocomplete 支持中文输入(firefox)修正方法
Mar 10 Javascript
ExtJs默认的字体大小改变的几种方法(自己整理)
Apr 18 Javascript
Js参数值中含有单引号或双引号问题的解决方法
Nov 06 Javascript
js根据日期判断星座的示例代码
Jan 23 Javascript
JS实用的动画弹出层效果实例
May 05 Javascript
jQuery+canvas实现简单的球体斜抛及颜色动态变换效果
Jan 28 Javascript
动态生成的DOM不会触发onclick事件的原因及解决方法
Aug 06 Javascript
Javascript 跨域知识详细介绍
Oct 30 Javascript
Vue.js实现价格计算器功能
Mar 30 Javascript
js实现扫雷小程序的示例代码
Sep 27 Javascript
Webpack path与publicPath的区别详解
May 03 Javascript
js计算两个时间差 天 时 分 秒 毫秒的代码
May 21 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
Laravel最佳分割路由文件(routes.php)的方式
2016/08/04 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
2017/07/21 PHP
js实现在文本框光标处添加字符的方法介绍
2012/11/24 Javascript
原生javascript图片自动或手动切换示例附演示源码
2013/09/04 Javascript
JSON无限折叠菜单编写实例
2013/12/16 Javascript
jQuery中:not选择器用法实例
2014/12/30 Javascript
jQuery实现给页面换肤的方法
2015/05/30 Javascript
AngularJS基础 ng-mouseleave 指令详解
2016/08/02 Javascript
Javascript 数组去重的方法(四种)详解及实例代码
2016/11/24 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(同步显示图像位置信息)
2016/12/02 Javascript
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
2016/12/14 Javascript
layer子层给父层页面元素赋值,以达到向父层页面传值的效果实例
2017/09/22 Javascript
JS中getElementsByClassName与classList兼容性问题解决方案分析
2019/08/07 Javascript
微信小程序实现Swiper轮播图效果
2019/11/22 Javascript
微信小程序实现同时上传多张图片
2020/02/03 Javascript
VUE-ElementUI 自定义Loading图操作
2020/11/11 Javascript
[01:51]2014DOTA2国际邀请赛 这个赛场没有失败者VGTi5再见
2014/07/23 DOTA
python简单商城购物车实例代码
2018/03/15 Python
在Python中给Nan值更改为0的方法
2018/10/30 Python
python批量创建指定名称的文件夹
2019/03/21 Python
python脚本第一行如何写
2020/08/30 Python
详解KMP算法以及python如何实现
2020/09/18 Python
配置管理计划的主要内容有哪些
2014/06/20 面试题
卫生安全检查制度
2014/02/04 职场文书
教师试用期自我鉴定
2014/02/12 职场文书
2014年药剂科工作总结
2014/11/26 职场文书
2015年世界艾滋病日活动总结
2015/03/24 职场文书
公司开会通知
2015/04/20 职场文书
作弊检讨书范文
2015/05/06 职场文书
教师节主题班会方案
2015/08/17 职场文书
2016大学生国家助学贷款承诺书
2016/03/25 职场文书
小学四年级班务总结该怎么写?
2019/08/16 职场文书
MYSQL 无法识别中文的永久解决方法
2021/06/03 MySQL
springboot如何接收application/x-www-form-urlencoded类型的请求
2021/11/02 Java/Android
Java Spring Lifecycle的使用
2022/05/06 Java/Android
win10拖拽文件时崩溃怎么解决?win10文件不能拖拽问题解决方法
2022/08/14 数码科技