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编程起步(第一课)
Jan 10 Javascript
javascript对下拉列表框(select)的操作实例讲解
Nov 29 Javascript
jquery ztree实现下拉树形框使用到了json数据
May 14 Javascript
Jquery自定义button按钮的几种方法
Jun 11 Javascript
解决JavaScript数字精度丢失问题的方法
Dec 03 Javascript
vue.js将unix时间戳转换为自定义时间格式
Jan 03 Javascript
jQuery实现的省市联动菜单功能示例【测试可用】
Jan 13 Javascript
详解react-native-fs插件的使用以及遇到的坑
Sep 12 Javascript
详解Node.js中path模块的resolve()和join()方法的区别
Oct 29 Javascript
Vue项目vscode 安装eslint插件的方法(代码自动修复)
Apr 15 Javascript
js实现缓动动画
Nov 25 Javascript
js Proxy的原理详解
May 25 Javascript
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
理解php Hash函数,增强密码安全
2011/02/25 PHP
php获取操作系统语言代码
2013/11/04 PHP
PHP中定义数组常量(array常量)的方法
2014/11/17 PHP
php类的扩展和继承用法实例
2015/06/20 PHP
php实现json编码的方法
2015/07/30 PHP
php生成复杂验证码(倾斜,正弦干扰线,黏贴,旋转)
2018/03/12 PHP
jQuery中创建实例与原型继承揭秘
2011/12/21 Javascript
js父页面中使用子页面的方法
2016/01/09 Javascript
Angular2实现自定义双向绑定属性
2017/03/22 Javascript
vuex与组件联合使用的方法
2018/05/10 Javascript
通过nodejs 服务器读取HTML文件渲染到页面的方法
2018/05/17 NodeJs
JavaScript惰性求值的一种实现方法示例
2019/01/11 Javascript
Moment.js实现多个同时倒计时
2019/08/26 Javascript
vue项目中定义全局变量、函数的几种方法
2019/11/08 Javascript
VSCode写vue项目一键生成.vue模版,修改定义其他模板的方法
2020/04/17 Javascript
深入了解JavaScript词法作用域
2020/07/29 Javascript
简单介绍使用Python解析并修改XML文档的方法
2015/10/15 Python
Pandas的read_csv函数参数分析详解
2019/07/02 Python
python 工具 字符串转numpy浮点数组的实现
2020/03/14 Python
TensorFlow2.X使用图片制作简单的数据集训练模型
2020/04/08 Python
Python调用OpenCV实现图像平滑代码实例
2020/06/19 Python
python 实现朴素贝叶斯算法的示例
2020/09/30 Python
Html5新标签解释及用法
2012/02/17 HTML / CSS
探索欧洲最好的品牌:Bombinate
2019/06/14 全球购物
GafasWorld西班牙:购买太阳镜、眼镜和隐形眼镜
2019/09/08 全球购物
经典c++面试题二
2015/08/14 面试题
后勤人员岗位职责
2013/12/17 职场文书
高中地理教学反思
2014/01/29 职场文书
优秀经理获奖感言
2014/03/04 职场文书
王力宏牛津大学演讲稿
2014/05/22 职场文书
水利水电专业自荐信
2014/07/08 职场文书
平面设计师岗位职责
2014/09/18 职场文书
工伤认定行政答辩状
2015/05/22 职场文书
ES6 解构赋值的原理及运用
2021/05/25 Javascript
mysql自增长id用完了该怎么办
2022/02/12 MySQL
基于PyQt5制作一个群发邮件工具
2022/04/08 Python