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 相关文章推荐
合并table相同单元格的jquery插件分享(很精简)
Jun 20 Javascript
jQuery过滤选择器详解
Jan 13 Javascript
Labelauty?jQuery单选框/复选框美化插件分享
Sep 26 Javascript
JQuery日期插件datepicker的使用方法
Mar 03 Javascript
js指定步长实现单方向匀速运动
Jul 17 Javascript
vue写一个组件
Apr 09 Javascript
javascript显示动态时间的方法汇总
Jul 06 Javascript
详解React中传入组件的props改变时更新组件的几种实现方法
Sep 13 Javascript
vue使用pdfjs显示PDF可复制的实现方法
Dec 14 Javascript
一个手写的vue放大镜效果
Aug 09 Javascript
JS中的算法与数据结构之字典(Dictionary)实例详解
Aug 20 Javascript
微信小程序完美解决scroll-view高度自适应问题的方法
Aug 08 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
win7+apache+php+mysql环境配置操作详解
2013/06/10 PHP
php缩放gif和png图透明背景变成黑色的解决方法
2014/10/14 PHP
PHP读取、解析eml文件及生成网页的方法示例
2017/09/04 PHP
laravel migrate初学常见错误的解决方法
2017/10/11 PHP
php使用imagecopymerge()函数创建半透明水印
2018/01/25 PHP
Thinkphp 在api开发中异常返回依然是html的解决方式
2019/10/16 PHP
判断JavaScript对象是否可用的最正确方法分析
2008/10/03 Javascript
Js 时间间隔计算的函数(间隔天数)
2011/11/15 Javascript
一个支持任意尺寸的图片上下左右滑动效果
2014/08/24 Javascript
Jquery中Event对象属性小结
2015/02/27 Javascript
JavaScript随机生成信用卡卡号的方法
2015/04/07 Javascript
JS+CSS实现的拖动分页效果实例
2015/05/11 Javascript
Node.js+Express配置入门教程详解
2016/05/19 Javascript
浅谈jQuery为哪般去掉了浏览器检测
2016/08/29 Javascript
详解node.js搭建代理服务器请求数据
2017/04/08 Javascript
jQuery Ajax使用FormData上传文件和其他数据后端web.py获取
2017/06/11 jQuery
vue地区选择组件教程详解
2018/05/04 Javascript
微信小程序之下拉列表实现方法解析(附完整源码)
2019/08/23 Javascript
如何利用JavaScript编写更好的条件语句详解
2020/08/10 Javascript
vscode 调试 node.js的方法步骤
2020/09/15 Javascript
几种实用的pythonic语法实例代码
2018/02/24 Python
Django 表单模型选择框如何使用分组
2019/05/16 Python
python使用pygame模块实现坦克大战游戏
2020/03/25 Python
Python实现给PDF添加水印的方法
2021/01/25 Python
纯CSS3实现的8种Loading动画效果
2014/07/05 HTML / CSS
英国复古服装和球衣购买网站:3Retro Football
2018/07/09 全球购物
Muziker英国:中欧最大的音乐家商店
2020/02/05 全球购物
俄罗斯电动工具和设备购物网站:Vseinstrumenti.ru
2020/11/12 全球购物
母婴店促销方案
2014/03/05 职场文书
社会公德演讲稿
2014/05/20 职场文书
2014年教育工作总结
2014/11/26 职场文书
员工自我工作评价
2015/03/06 职场文书
写给女朋友的保证书
2015/05/09 职场文书
2016年毕业实习心得体会范文
2015/10/09 职场文书
2019生态环境保护倡议书!
2019/07/03 职场文书
MySQL中distinct和count(*)的使用方法比较
2021/05/26 MySQL