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 16 Javascript
jquery插件 autoComboBox 下拉框
Dec 22 Javascript
javascript 实现字符串反转的三种方法
Nov 23 Javascript
微信小程序模板之分页滑动栏
Feb 10 Javascript
javascript 删除数组元素和清空数组的简单方法
Feb 24 Javascript
jQuery tip提示插件(实例分享)
Apr 28 jQuery
js中变量的连续赋值(实例讲解)
Jul 08 Javascript
Bootstrap Table 搜索框和查询功能
Nov 30 Javascript
vue-router启用history模式下的开发及非根目录部署方法
Dec 23 Javascript
vue使用better-scroll实现滑动以及左右联动
Jun 30 Javascript
在vscode 中设置 vue模板内容的方法
Sep 02 Javascript
详解TypeScript中的类型保护
Apr 29 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
深入HTTP响应状态码速查表的详解
2013/06/07 PHP
Windows下wamp php单元测试工具PHPUnit安装及生成日志文件配置方法
2018/05/28 PHP
Laravel框架实现的记录SQL日志功能示例
2018/06/19 PHP
FF IE兼容性的修改小结
2009/09/02 Javascript
a标签的href和onclick 的事件的区别介绍
2013/07/26 Javascript
js实现瀑布流的一种简单方法实例分享
2013/11/04 Javascript
jQuery 浮动导航菜单适合购物商品类型的网站
2014/09/09 Javascript
jQuery插件制作之全局函数用法实例
2015/06/01 Javascript
JS基于面向对象实现的拖拽功能示例
2016/12/20 Javascript
js实现图片加载淡入淡出效果
2017/04/07 Javascript
bootstrap模态框示例代码分享
2017/05/17 Javascript
React/Redux应用使用Async/Await的方法
2017/11/16 Javascript
利用npm 安装删除模块的方法
2018/05/15 Javascript
webpack的CSS加载器的使用
2018/09/11 Javascript
使用微信小程序开发弹出框应用实例详解
2018/10/18 Javascript
[48:48]VGJ.T vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
[01:39:04]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第二场 2月1日
2021/03/11 DOTA
从零学python系列之新版本导入httplib模块报ImportError解决方案
2014/05/23 Python
Python单例模式实例分析
2015/01/14 Python
Python实现的数据结构与算法之队列详解
2015/04/22 Python
Python if语句知识点用法总结
2018/06/10 Python
解决Python print输出不换行没空格的问题
2018/11/14 Python
Python math库 ln(x)运算的实现及原理
2019/07/17 Python
Win10系统下安装labelme及json文件批量转化方法
2019/07/30 Python
Python学习笔记之错误和异常及访问错误消息详解
2019/08/08 Python
如何打包Python Web项目实现免安装一键启动的方法
2020/05/21 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
2020/11/28 Python
单身旅行者的单身假期:Just You
2018/04/08 全球购物
服务行业个人求职的自我评价
2013/12/12 职场文书
求职简历中自我评价
2014/01/28 职场文书
专家推荐信模板
2014/05/09 职场文书
讲党性心得体会
2014/09/03 职场文书
六查六看个人剖析材料
2014/10/14 职场文书
司法局群众路线教育实践活动开展情况总结
2014/10/25 职场文书
入党函调证明材料
2015/06/19 职场文书
css让页脚保持在底部位置的四种方案
2022/07/23 HTML / CSS