js 监控iframe URL的变化实例代码


Posted in Javascript onJuly 12, 2017

iframe的url可以前端任何地址,这样就可能出现漏洞,如果钓鱼网站通过js把src改成了危险地址,如果没有监控,就会有很大隐患。所以监控iframe的url变化就是必须要解决的问题了。

第一印象的解决方案是通过setInterval轮询监控,貌似不太理想了,而且有延迟。

千般搜索,终于找到了好的方法,可以通过H5新增的MutationObserver来解决,配合DOMAttrModified和onpropertychange来解决兼容性问题。

废话少说,直接上代码。

index.html代码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <iframe id="iframeId" src="https://m.ppdai.com">
    
  </iframe>
  <script type="text/javascript" charset="utf-8" async defer>
    var elemIframList = document.getElementsByTagName('iframe');
    for(var i=0;i<elemIframList.length;i++){
      initIframeChange(elemIframList[i]);
    }
    function initIframeChange(elemIfram) {
      if (window.MutationObserver || window.webkitMutationObserver) {
        // chrome
        var callback = function(mutations) {
          mutations.forEach(function(mutation) {
            iframeSrcChanged(mutation.oldValue,mutation.target.src,mutation.target);
          });
        };
        if (window.MutationObserver) {
          var observer = new MutationObserver(callback);
        } else {
          var observer = new webkitMutationObserver(callback);
        }
        observer.observe(elemIfram, {
          attributes: true,
          attributeOldValue: true
        });
      } else if (elemIfram.addEventListener) {
        // Firefox, Opera and Safari
        elemIfram.addEventListener("DOMAttrModified", function(event){iframeSrcChanged(event.prevValue,event.newValue,event.target);}, false);
      } else if (elemIfram.attachEvent) {
        // Internet Explorer
        elemIfram.attachEvent("onpropertychange", function(event){iframeSrcChanged(event.prevValue,event.newValue,event.target);});
      }
    }

    function iframeSrcChanged(oldValue,newValue,iframeObj) {
      console.log('旧地址:'+oldValue);
      console.log('新地址:'+newValue);
      if(newValue.indexOf('aaaa')>-1){
        console.log('有危险,请马上离开……')
        iframeObj.src=oldValue;//钓鱼地址,恢复原url
      }else{
        console.log('安全地址,允许跳转……');
      }
    }

    // 模拟方法
    function simuChange() {
      var div = document.getElementById("iframeId");
      div.setAttribute("src", "aaaa.html");
    }
  </script>
</body>
</html>

aaaa.html代码

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  aaaaaaaa.html
  <script type="text/javascript" charset="utf-8" async defer>
    console.log('aaaa页面的js执行成功')    
  </script>
</body>
</html>

执行结果:

危险情况:

js 监控iframe URL的变化实例代码

安全情况:

js 监控iframe URL的变化实例代码

我们发现,如果跳转到危险页面,可以直接恢复旧页面,或者跳转指定安全页面,危险页面的js并不会执行。

这貌似就是我们想要的结果。

以上这篇js 监控iframe URL的变化实例代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript检查日期格式的函数[比较全]
Oct 17 Javascript
jQuery 图像裁剪插件Jcrop的简单使用
May 22 Javascript
JQuery防止退格键网页后退的实现代码
Mar 23 Javascript
关于JS字符串函数String.replace()
Apr 07 Javascript
基于JavaScript代码实现兼容各浏览器的设为首页和加入收藏
Jan 07 Javascript
JavaScript html5 canvas画布中删除一个块区域的方法
Jan 26 Javascript
详解AngularJS 模态对话框
Apr 07 Javascript
解决Extjs下拉框不显示的问题
Jun 21 Javascript
Vue实现数字输入框中分割手机号码的示例
Oct 10 Javascript
vue.config.js中配置Vue的路径别名的方法
Feb 11 Javascript
Vue使用Element实现增删改查+打包的步骤
Nov 25 Vue.js
vue使用lodop打印控件实现浏览器兼容打印的方法
Feb 07 Vue.js
jQuery 循环遍历改变a标签的href(实例讲解)
Jul 12 #jQuery
浅谈原生JS中的延迟脚本和异步脚本
Jul 12 #Javascript
基于zepto.js实现手机相册功能
Jul 11 #Javascript
React-Native实现ListView组件之上拉刷新实例(iOS和Android通用)
Jul 11 #Javascript
详解Webpack DLL用法以及功能
Jul 11 #Javascript
Bootstrap弹出框之自定义悬停框标题、内容和样式示例代码
Jul 11 #Javascript
node使用UEditor富文本编辑器的方法实例
Jul 11 #Javascript
You might like
使用apache模块rewrite_module (转)
2007/02/14 PHP
PHP实现基于栈的后缀表达式求值功能
2017/11/10 PHP
解决laravel中日志权限莫名变成了root的问题
2019/10/17 PHP
Laravel5.1 框架响应基本用法实例分析
2020/01/04 PHP
基于PHP实现用户登录注册功能的详细教程
2020/08/04 PHP
phpwind放自动注册方法
2006/12/02 Javascript
jQuery操作select的实例代码
2012/06/14 Javascript
Jquery实现三层遍历删除功能代码
2013/04/23 Javascript
网站如何做到完全不需要jQuery也可以满足简单需求
2013/06/27 Javascript
javascript预加载图片、css、js的方法示例介绍
2013/10/14 Javascript
使用CSS+JavaScript或纯js实现半透明遮罩效果的实例分享
2016/05/09 Javascript
使用Bootstrap typeahead插件实现搜索框自动补全的方法
2016/07/07 Javascript
Angular中$cacheFactory的作用和用法实例详解
2016/08/19 Javascript
nodejs批量下载图片的实现方法
2017/05/19 NodeJs
php简单数据库操作类的封装
2017/06/08 Javascript
[01:14:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Orenda
2014/05/22 DOTA
python根据经纬度计算距离示例
2014/02/16 Python
Python如何读取MySQL数据库表数据
2017/03/11 Python
更改Python的pip install 默认安装依赖路径方法详解
2018/10/27 Python
python 列表递归求和、计数、求最大元素的实例
2018/11/28 Python
基于Python打造账号共享浏览器功能
2019/05/30 Python
python3通过qq邮箱发送邮件以及附件
2020/05/20 Python
Python包和模块的分发详细介绍
2020/06/19 Python
美国家居装饰和豪华家具购物网站:One Kings Lane
2018/12/24 全球购物
哄娃神器4moms商店:美国婴童用品品牌
2019/03/07 全球购物
德国珠宝和配件商店:Styleserver
2021/02/23 全球购物
保安员岗位职责
2013/11/17 职场文书
超市5.1促销活动
2014/01/15 职场文书
先进事迹报告会感言
2014/01/24 职场文书
导师评语大全
2014/04/26 职场文书
爱情保证书大全
2014/04/29 职场文书
林肯就职演讲稿
2014/05/19 职场文书
母亲节寄语大全
2015/02/27 职场文书
创业计划书之旅游网站
2019/09/06 职场文书
JavaScript组合继承详解
2021/11/07 Javascript
前端监听websocket消息并实时弹出(实例代码)
2021/11/27 Javascript