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控制frame,iframe的src属性代码
Dec 31 Javascript
javascript同页面多次调用弹出层具体实例代码
Aug 16 Javascript
ExtJS4如何自动生成控制grid的列显示、隐藏的checkbox
May 02 Javascript
BootStrap扔进Django里的方法详解
May 13 Javascript
JavaScript中校验银行卡号的实现代码
Dec 19 Javascript
JavaScript生成.xls文件的代码
Dec 22 Javascript
Html5 js实现手风琴效果
Apr 17 Javascript
JS实现弹出下载对话框及常见文件类型的下载
Jul 13 Javascript
初探JavaScript 面向对象(推荐)
Sep 03 Javascript
jQuery实现IE输入框完成placeholder标签功能的方法
Sep 20 jQuery
详解webpack + react + react-router 如何实现懒加载
Nov 20 Javascript
JS如何实现在弹出窗口中加载页面
Dec 03 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控制用户的浏览器--ob*函数的使用说明
2007/03/16 PHP
PHP集成环境XAMPP的安装与配置
2018/11/13 PHP
PHP常用正则表达式精选(推荐)
2019/05/28 PHP
Autocomplete Textbox Example javascript实现自动完成成功
2007/08/17 Javascript
JavaScript 对象链式操作测试代码
2010/04/25 Javascript
JSChart轻量级图形报表工具(内置函数中文参考)
2010/10/11 Javascript
JS 无限级 Select效果实现代码(json格式)
2011/08/30 Javascript
javascript中直接写php代码的方法
2013/07/31 Javascript
jQuery分别获取选中的复选框值的示例
2014/06/17 Javascript
10分钟学会写Jquery插件实例教程
2014/09/06 Javascript
node.js中的定时器nextTick()和setImmediate()区别分析
2014/11/26 Javascript
jquery密码强度校验
2015/12/02 Javascript
jQuery绑定自定义事件的魔法升级版
2016/06/30 Javascript
浅谈JS函数定义方式的区别
2016/10/30 Javascript
Javascript中return的使用与闭包详解
2017/01/11 Javascript
JS正则验证多个邮箱完整实例【邮箱用分号隔开】
2017/04/19 Javascript
node.js中实现kindEditor图片上传功能的方法教程
2017/04/26 Javascript
vue的toast弹窗组件实例详解
2018/05/14 Javascript
详解Vue-cli3 项目在安卓低版本系统和IE上白屏问题解决
2019/04/14 Javascript
[38:32]完美世界DOTA2联赛循环赛 Forest vs DM 第二场 11.06
2020/11/06 DOTA
Python正确重载运算符的方法示例详解
2017/08/27 Python
Python中 传递值 和 传递引用 的区别解析
2018/02/22 Python
对python中for、if、while的区别与比较方法
2018/06/25 Python
Python中logging.NullHandler 的使用教程
2018/11/29 Python
pyqt 实现在Widgets中显示图片和文字的方法
2019/06/13 Python
Python使用pymysql模块操作mysql增删改查实例分析
2019/12/19 Python
Python使用Selenium模拟浏览器自动操作功能
2020/09/08 Python
Python接口自动化系列之unittest结合ddt的使用教程详解
2021/02/23 Python
洛佩桑酒店官方网站:Lopesan Hotels
2019/04/15 全球购物
L’urv官网:精品女性运动服品牌
2019/07/07 全球购物
幼儿园新学期寄语
2014/01/18 职场文书
2014年物资管理工作总结
2014/12/02 职场文书
2014年教研员工作总结
2014/12/23 职场文书
办公室个人总结
2015/02/28 职场文书
幼儿园庆六一主持词
2015/06/30 职场文书
8个JS的reduce使用实例和reduce操作方式
2021/10/05 Javascript