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 相关文章推荐
原型方法的不同写法居然会影响调试的解决方法
Mar 08 Javascript
JS 判断undefined的实现代码
Nov 26 Javascript
javascript基础之查找元素的详细介绍(访问节点)
Jul 05 Javascript
Javascript执行效率全面总结
Nov 04 Javascript
JavaScript+CSS控制打印格式示例介绍
Jan 07 Javascript
基于iframe实现类似于ajax的页面无刷新
May 31 Javascript
JS实现浏览器状态栏文字从右向左弹出效果代码
Oct 27 Javascript
javascript针对cookie的基本操作实例详解
Nov 30 Javascript
jQuery实现网页顶部固定导航效果代码
Dec 24 Javascript
jQuery通过写入cookie实现更换网页背景的方法
Apr 15 Javascript
基于js实现二级下拉联动
Dec 17 Javascript
使用vue2.0创建的项目的步骤方法
Sep 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
《Pokemon Sword·Shield》系列WEB动画《薄明之翼》第2话声优阵容公开!
2020/03/06 日漫
php实现的click captcha点击验证码类实例
2014/09/23 PHP
PHP 实现代码复用的一个方法 traits新特性
2015/02/22 PHP
学习php设计模式 php实现适配器模式
2015/12/07 PHP
PHP保存session到memcache服务器的方法
2016/01/19 PHP
js 表单验证方法(实用)
2009/04/28 Javascript
js判断输入是否为数字的具体实例
2013/08/03 Javascript
js控制表单操作的常用代码小结
2013/08/15 Javascript
extjs表格文本启用选择复制功能具体实现
2013/10/11 Javascript
jQuery内容过滤选择器用法分析
2015/02/10 Javascript
JavaScript 中 apply 、call 的详解
2017/03/21 Javascript
浅谈angular4生命周期钩子
2017/09/05 Javascript
Express + Session 实现登录验证功能
2017/09/08 Javascript
jQuery实现可兼容IE6的遮罩功能详解
2017/09/19 jQuery
你点的 ES6一些小技巧,请查收
2018/04/25 Javascript
详解webpack之图片引入-增强的file-loader:url-loader
2018/10/08 Javascript
如何使用puppet替换文件中的string
2018/12/06 Javascript
@angular前端项目代码优化之构建Api Tree的方法
2018/12/24 Javascript
如何优雅地在Node应用中进行错误异常处理
2019/11/25 Javascript
JS实现网页时钟特效
2020/03/25 Javascript
简单解决Python文件中文编码问题
2015/11/22 Python
python+POP3实现批量下载邮件附件
2018/06/19 Python
Python中list循环遍历删除数据的正确方法
2019/09/02 Python
Python合并2个字典成1个新字典的方法(9种)
2019/12/19 Python
python实现UDP协议下的文件传输
2020/03/20 Python
Python项目实战之使用Django框架实现支付宝付款功能
2021/02/23 Python
Canvas绘制浮动球效果的示例
2017/12/29 HTML / CSS
英国乡村时尚和宠物用品专家:Pet & Country
2018/07/02 全球购物
美国小蜜蜂Burt’s Bees德国官网:天然唇部、皮肤和身体护理产品
2020/06/14 全球购物
Internet主要有哪些网络群组成
2015/12/24 面试题
20年同学聚会邀请函
2014/02/04 职场文书
商业融资计划书
2014/04/29 职场文书
家具公司总经理岗位职责
2014/07/08 职场文书
城管执法人员纪律作风整顿思想汇报
2014/09/13 职场文书
大学迎新生的欢迎词
2019/06/25 职场文书
Python机器学习之逻辑回归
2021/05/11 Python