zoukankan      html  css  js  c++  java
  • 防运营商劫持代码

     

    一、什么是运营商劫

    什么是运营商:

    运营商是指那些提供宽带服务的ISP,包括三大运营商中国电信、中国移动、中国联通,还有一些小运营商,比如长城宽带、歌华有线宽带。运营商提供最最基础的网络服务,掌握着通往用户物理大门的钥匙,目前运营商劫持很普遍。

    举个劫持的栗子:

    劫持方式:

    运营商比较常见的作恶方式有三种,分别是DNS劫持、HTTP劫持、HTTPS劫持:

    DNS劫持:这种劫持会把你重新定位到其它网站,我们所熟悉的钓鱼网站就是这个原理。但是因为它的违法性,现在被严厉的监管起来,已经很少见。

    HTTP劫持:虽然DNS劫持已经被监管了起来,但是还有HTTP劫持啊!你DNS解析的域名的IP地址不变,当运营商发现你的是HTTP请求时,就会在里面插入一些奇奇怪怪的广告(比如一些banner、浮标、更有甚把你你的商品位给劫持了 WTF...)并且这种现象十分常见,不信你可以试着随便打开一个网页,仔细看看你就会发现一些小尾巴,这就是被HTTP劫持了。

    HTTPS劫持:安全的超文本传输协议,数据加密这也能劫持?答案是肯定的!该劫持方式有两种:

    1. 伪造证书,通过病毒或者其他方式将伪造证书的根证书安装在用户系统中(较少)
    2. 代理也有客户的证书与私钥,或者客户端与代理认证的时候不校验合法性,即可通过代理来与我们服务端进行数据交互(较多)

    备注:使用本篇的代码一定会让你查到HTTPS劫持的(前提是使用了https)

    二、防运营商劫持

    准确的来说是防script、iframe注入型劫持,95%以上是这种劫持方式,因为DNS劫持被严管了。

    运营商是如何劫持的,网上有很多资料,这里不多逼逼

    下面是防劫持代码:

    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8" />
      <title>防劫持代码测试</title>
      <script>
        console.log('发生劫持,初始化就直接置顶的流氓行为,暂无法防御,但可以通过埋点记录LOG,向工信部投诉!!');
      </script>
      <!-- 防劫持 -->
      <script shendun-eddy>
        /**
         * @note 防劫持代码
         * @key MutationObserver 提供了监视对DOM树所做更改的能力 
         */
        (function() {
          var srcFilterTags = ['script', 'iframe'];
          // 域名白名单 可以加多个
          var whiteList = ['zeptojs.com'];
          var whiteListReg = [];
    
          // 正则匹配
          whiteList.forEach(function(wl) {
            var wlReg = new RegExp('/.+?//' + wl + '|//' + wl + '|.+?.' + wl + '|^' + wl);
            whiteListReg.push(wlReg);
          });
          // 白名单助手
          var inWhileList = function(addedNode) {
            // shendun-eddy 是script的白名单标签
            if (addedNode.src === '' && addedNode.getAttribute('shendun-eddy') !== null) {
              return true;
            }
    
            var isInWhiteList = false;
    
            whiteListReg.forEach(function(wlReg) {
              if (wlReg.test(addedNode.src)) {
                isInWhiteList = true;
                return false;
              }
            });
    
            return isInWhiteList;
          };
    
          // dom观察器
          var mutationHandler = function(records) {
            records.forEach(function(record) {
              Array.prototype.slice.call(record.addedNodes).forEach(function(addedNode) {
                srcFilterTags.forEach(function(tagName) {
                  // 标签匹配 白名单匹配
                  if (addedNode.tagName === tagName.toUpperCase() && !inWhileList(addedNode)) {
                    addedNode.remove();
                  };
                });
              });
            })
          };
    
          // 核心 - MutationObserver 提供了监视对DOM树所做更改的能力
          // 优点 - 动态监听是否有非法的 iframe 和 script 代码
          // 缺点 - 无法查找头部直接插入的代码
          var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver,
            observeMutationSupport = !!MutationObserver;
          var html = document.getElementsByTagName('html')[0];
    
          if (observeMutationSupport) {
            new MutationObserver(mutationHandler).observe(html, {
              'childList': true,
              'subtree': true
            });
          }
    
          // 唯独直接加载的不能remove掉,异步加载的都能remove掉!!
          // ***  记录头部的script,通知工信部 ***
          var eleList = document.querySelectorAll('script');
          var len = eleList.length;
          for (var i = 0; i < len; i++) {
            // 遍历操作
            if (!inWhileList(eleList[i])) {
              // do sth 这里的删除虽然已经晚了,因为头部同步JS已被执行,删除操作意义不大,但可以统计被劫持的代码是什么,记录好LOG 通知工信部
              // sendLog
              eleList[i].remove();
            }
          }
        })();
      </script>
      <script>console.log("劫持1");</script>
    </head>
    <body>
      <div>防劫持代码测试</div>
      <div class="father">
        <div class="bro">
          <div class="xiongdei">
            <script src="https://mt.cnzz.com/js/hdpi_canvas.js"></script>
          </div>
        </div>
      </div>
      <script src="http://zeptojs.com/zepto.min.js"></script>
      <!-- 这里执行了 console.log('哎哟,我来劫持你了...'); 虽然访问了这个script, 但被remove了不会执行-->
      <script src="http://yun.dui88.com/qiho-h5/jqg/shendun_test.js"></script>
      <script>console.log("劫持....");</script>
    </body>
    </html>
     

    加入运营商劫持代码后,不在白名单和安全标签(shendun-eddy)内的script或者iframe都会被remove掉。

    提示:network内能看到加载了其他非白名单内的script代码,但它们都没有执行

    yun.dui88.com/qiho-h5/jqg… 为例,代码如下:

    ;(function(){
      console.log('哎哟,我来劫持你了...');
    })()
    复制代码

    核心功能

    MutationObserver()创建并返回一个新的 MutationObserver 它会在指定的DOM发生变化时被调用。

    具体参数和用法传送门:developer.mozilla.org/zh-CN/docs/…

    兼容性

    所有浏览器的兼容性是92.79%,手机端的兼容性更高,代码中加了保护所以放心使用吧!

    三、总结

    目前运营商劫持率大约是3% ~ 25%,它们无处不在。

    为了还用户一个干净安全的浏览环境,我们需要做好预防措施

    1. 全站https,能防一部分
    2. 加入防运营商劫持代码,能防大部分注入型劫持
    3. 记录Log,记录证据,向工信部投诉
     
    很实用,拿过来以便备用,转载自掘金https://juejin.im/post/5bea7eb4f265da612859a9e4

  • 相关阅读:
    前端小白之每天学习记录php(2)数据库操作软件
    前端小白之每天学习记录简单的原生js路由
    Dualembedded LSTM for QA match: 双embedding的LSTM聊天匹配式模型
    歌词爬虫
    Web第六周作业:css单位
    一篇无厘头的Roadmap
    web第二周作业:Register Form
    Web第六周作业:position.fixed vs sticky
    Web第六周作业:css颜色表
    Web第三周作业:grid layout
  • 原文地址:https://www.cnblogs.com/wuyuchao/p/9983697.html
Copyright © 2011-2022 走看看