微信QQ的二维码登录原理js代码解析

这篇文章主要大家详细解析了微信QQ的二维码登录原理js代码,
具有一定的参考价值,感兴趣的小伙伴们可以参考一下

在很多地方就是都出现了使用二维码登录,二维码付款,二维码账户等应用(这里的二维码种马,诈骗就不说了),

二维码验证,多终端辅助授权应用开始多起来,这里先说下啥是二维码,其实二维码就是存了二进制数据的黑白图片,

当出现要求二维码登录的时候,服务器会生成一条临时的唯一的二维码信息,发送到客户端以二维码(图片)的形式写入到网页,

然后你就会看到统一的四个方形的二维码,如果做的好这个二维码信息应该是有时效的,这里暂且不考虑这些,

就简单的微信登录作为例子看看吧:

 

首先说下整个授权流程:

在客户端网页中会不断向服务器发送https连接,并且这里传输很少的数据之后就断开连接了,下面看下微信网页中这个login1c709c.js文件:

(function($, _aoWin) {  
   
 _aoWin.QRLogin = {};  
  _aoWin.LoginLog = "";  
 var _sBaseHost = "",  
    _oLoginQrCodeImg = document.getElementById("loginQrCode");  
 if (document.domain == "qq.com") {  
 _sBaseHost = "weixin.qq.com";  
 } else if(location.hostname.match(/(wechat\.com)$/)){  
 _sBaseHost = "wechat.com";  
 }else{  
    _sBaseHost = "wechatapp.com";  
  }  
   
 var show_tip = 1,  
 _sCurUUId,  
 _oResetTimeout,  
    _aWebMMCallbacks = [],  
    _oDetactWebMMInterval = setInterval(function(){  
      if(_aoWin.WebMM){  
        clearInterval(_oDetactWebMMInterval);  
        var callback;  
        while(callback = _aWebMMCallbacks.shift()){  
          if(typeof(callback) != "function") continue;  
          callback();  
        }  
      }  
    }, 1000);  
   
  function _logInPage(_asLog){  
    _aoWin.LoginLog = LoginLog + _asLog + "\n";  
  }  
   
  function _afterLoadWebMMDo(callback){  
    if(!_aoWin.WebMM){  
      _aWebMMCallbacks.push(callback);  
    }else{  
      callback();  
    }  
  }  
   
  function _reportNow(text){  
    _logInPage(text);  
    _afterLoadWebMMDo(function(){  
      WebMM.ossLog({Text: text});  
      WebMM.flushOssLog();  
    });  
  }  
   
  var reLoadQRImgCount = 0,  
    loadQRCodeTime = 0,  
    loadQRImgSucc = function(){  
      clearInterval(loadQRImgWatchDog);  
      _logInPage("Load QRCode Success, time=" + (new Date().getTime() - loadQRCodeTime) + "ms, reload count: " + reLoadQRImgCount);  
    },  
    loadQRImgFail = function(img){  
      _reportNow("Load QRcode fail!" + status + ", src: " + img.src + ", time: " + (new Date().getTime() - loadQRCodeTime) + "ms");  
    },  
    loadQRImgWatchDog = null;  
 function _loadQRImg(uuid) {  
    _poll(uuid);  
    _logInPage("Load QRCode Start");  
    loadQRCodeTime = new Date().getTime();  
   
    _oLoginQrCodeImg.onload = function(){  
      loadQRImgSucc();  
      _oLoginQrCodeImg.onload = null;  
    };  
    _oLoginQrCodeImg.onerror = function(){loadQRImgFail(this)};  
    _oLoginQrCodeImg.src = "https://login."+_sBaseHost+"/qrcode/"+uuid+"?t=webwx";  
   
    loadQRImgWatchDog = setInterval(function(){  
      if (reLoadQRImgCount >= 5) {  
        _reset();  
        return;  
      }  
      reLoadQRImgCount++;  
   
      var _img = new Image();  
      _img.onload = function () {  
        if(!_oLoginQrCodeImg.onload) return;  
   
        _oLoginQrCodeImg.onload = null;  
        _oLoginQrCodeImg.src = this.src;//replace  
        loadQRImgSucc();  
      };  
      _img.onerror = function(){loadQRImgFail(this)};  
      _img.src = _oLoginQrCodeImg.src + "&r=" + new Date().getTime();  
    }, 5000);  
  }  
   
  var _sSecondRequestTime = 0,  
    _nAjaxTimeout = 100 * 1000,  
    _nNewLoginFuncErrCount = 0;  
 function _poll(_asUUID) {  
 var _self = arguments.callee,  
      _nTime = 0;  
 _sCurUUId = _asUUID;  
   
    _logInPage("_poll Request Start, time: " + new Date().getTime());  
    _nTime = new Date().getTime();  
 $.ajax({  
 type: "GET",  
 url: "https://login." + _sBaseHost + "/cgi-bin/mmwebwx-bin/login?uuid=" + _asUUID + "&tip=" + show_tip,  
 dataType: "script",  
 cache: false,  
 timeout: _nAjaxTimeout,  
 success: function(data, textStatus, jqXHR) {  
      _logInPage("_poll Request Success, code: " + window.code + ", time: " + (new Date().getTime() - _nTime) + "ms");  
  switch (_aoWin.code) {  
  case 200:  
        _sSecondRequestTime = new Date().getTime() - _sSecondRequestTime;  
        _logInPage("Second Request Success, time: " + _sSecondRequestTime + "ms");  
  clearTimeout(_oResetTimeout);  
   
        var _fNewLoginFunc = function(){  
          $.ajax({  
            url: _aoWin.redirect_uri + "&fun=new",//new login page  
            type: "GET",  
            success:function(msg) {  
              _logInPage("new func reponse, reponseMsg: " + msg);  
              var code = msg.match(/<script>(.*)<\/script>/);  
              var skey=msg.match(/<skey>(.*)<\/skey>/);  
              if(code){  
                eval(code[1]);  
              }else{  
                $("#container").show();  
                $("#login_container").hide();  
              }  
              if(skey && skey[1]){  
               WebMM.model("account").setSkey(skey[1]);  
              }  
            },  
            error:function(jqXHR, textStatus, errorThrown){  
              _nNewLoginFuncErrCount++;  
              if(_nNewLoginFuncErrCount > 5){  
                if(confirm("Call new login page func error, refresh?")){location.reload()}  
                return;  
              }  
              _reportNow(_aoWin.redirect_uri + " New login page func error: " + textStatus +" retryCount:" + _nNewLoginFuncErrCount);  
              setTimeout(_fNewLoginFunc, 500);  
            }  
          });  
        };  
        _fNewLoginFunc();  
   
        _reportNow("/cgi-bin/mmwebwx-bin/login, Second Request Success, uuid: " + _asUUID + ", time: " + _sSecondRequestTime + "ms");  
  break;  
   
  case 201:  
        clearTimeout(_oResetTimeout);  
  show_tip = 0;  
  $('.errorMsg').hide();  
  $('.normlDesc').hide();  
  $('.successMsg').show();  
        _reportNow("/cgi-bin/mmwebwx-bin/login, First Request Success, uuid: " + _asUUID);  
        _reportNow("/cgi-bin/mmwebwx-bin/login, Second Request Start, uuid: " + _asUUID);  
   
        _sSecondRequestTime = new Date().getTime();  
   
        //_nAjaxTimeout = 5 * 1000;  
        _self(_asUUID);  
        break;  
   
  case 408:  
  setTimeout(function(){  
   _self(_asUUID);  
  }, 500);  
  break;  
   
  case 400:  
  case 500:  
        _reset();  
        _afterLoadWebMMDo(function(){  
   _aoWin.Log.d("500, Login Poll Svr Exception");  
  });  
  break;  
  }  
 },  
 error: function(jqXHR, textStatus, errorThrown) {  
  if (textStatus == 'timeout') {  
        setTimeout(function(){  
          _self(_asUUID);  
        }, 500);  
  } else {  
        setTimeout(function(){  
          _self(_asUUID);  
        }, 5000);  
   
        _logInPage("_poll Request Error:" + textStatus);  
        _afterLoadWebMMDo(function(){  
          _aoWin.Log.e("Login Poll Error:" + textStatus);  
        });  
  }  
 }  
 });  
 }  
   
  var getUUIDCount = 0,  
    _getUUIDWatchDog,  
    _bGetUUIDSuccess = false;//ajax successִ  
 function _getUUID() {  
    getUUIDCount++;  
    var _self = arguments.callee,  
      _loadError = function(errorText){  
        _reportNow("Load UUID Error! ErrorText: " + errorText + " getUUIDCount=" + getUUIDCount);  
        if(getUUIDCount > 5){  
          if (confirm("Load uuid error. Refresh?")) {  
            location.reload();  
          }  
        }  
        setTimeout(function(){  
          _self();  
        }, 500);  
      };  
   
    clearTimeout(_getUUIDWatchDog);  
    _getUUIDWatchDog = setTimeout(function(){  
      if(!_aoWin.QRLogin.code){  
        _logInPage("GetUUID Timeout, WatchDog Run");  
        _self();  
      }  
    }, 10000);  
   
    $.ajax({  
      type: "GET",  
      url: "https://login." + _sBaseHost + "/jslogin?appid=wx782c26e4c19acffb&redirect_uri="+encodeURIComponent(location.protocol+"//"+location.host+"/cgi-bin/mmwebwx-bin/webwxnewloginpage")+"&fun=new&lang=" + document.lang,  
      dataType: "script",  
      cache: false,  
      success : function(){  
        clearTimeout(_getUUIDWatchDog);  
        if(_bGetUUIDSuccess) return;  
        if (_aoWin.QRLogin && _aoWin.QRLogin.code == 200) {  
          _logInPage("GetUUID Success, UUID=" + QRLogin.uuid);  
          _bGetUUIDSuccess = true;  
   
          clearTimeout(_oResetTimeout);  
          _oResetTimeout = setTimeout(function(){  
            location.reload();//Note: Don't run _reset(). If you run _reset(), there will may have many _poll request, as they get 408 return code  
          }, 5 * 60 *1000);//5 mins  
   
          _loadQRImg(QRLogin.uuid);  
        } else {  
          var QRLoginCode = (_aoWin.QRLogin && _aoWin.QRLogin.code) ? _aoWin.QRLogin.code : "None";  
          _logInPage("GetUUID Error, QRLogin.code=" + QRLoginCode);  
          _loadError("QRLogin.code= " + QRLoginCode);  
        }  
      },  
      error : function(xhr, textStatus, errorThrown){  
        _logInPage("GetUUID Error, textStatus=" + textStatus);  
        _loadError(textStatus);  
      }  
    });  
 }  
   
  function _reset(){  
    location.reload();  
  }  
   
 if ($("#login_container").is(":visible") ) {  
    _getUUID();  
 }  
   
    
 var _bHadLog = false;  
 function _ossLog() {  
 if (_bHadLog) return;  
 _bHadLog = true;  
 var _sUvid = document.cookie.match(new RegExp( "(^| )"+"webwxuvid"+"=([^;]*)(;|$)"));  
    if(!_sUvid || _sUvid.length < 3) return;  
    _sUvid = _sUvid[2];  
 (new Image()).src = "/cgi-bin/mmwebwx-bin/webwxstatreport?funkey=indexdemo&uvid="+_sUvid+"&uuid="+_sCurUUId;  
 }  
   
   
 if($("img.guide").length > 0) {  
 var _nTimer = 0,  
  _oGuide$ = $(".guide"),  
  _oGuideTrigger$ = $("#guideTrigger, #tipTrigger"),  
  _oMask$ = $(".mask");  
   
  function _back() {  
  _nTimer = setTimeout(function() {  
  _oMask$.stop().animate({opacity:0}, function(){$(".mask").hide()});  
  _oGuide$.stop().animate({marginLeft:"-120px",opacity:0}, "400", "swing",function(){  
   _oGuide$.hide();  
  });  
  }, 100);  
 }  
   
 /*guide*/  
 _oGuide$.css({"left":"50%", "opacity":0});  
 _oGuideTrigger$.css({"backgroundColor":"white", "opacity":"0"});  
 _oGuideTrigger$.mouseover(function(){  
  clearTimeout(_nTimer);  
  _oMask$.show().stop().animate({"opacity":0.2});  
  _oGuide$.css("display", "block").stop().animate({marginLeft:"+168px", opacity:1}, 900, "swing", function() {  
  _oGuide$.animate({marginLeft:"+153px"}, 300);  
  });  
  _ossLog();  
 }).mouseout(_back);  
   
 _oGuide$.mouseover(function(){  
  clearTimeout(_nTimer);  
 }).mouseout(_back);  
 }  
})(jQuery, window); 

  细读js之后,你就会从网页客户端这边看到请求登录的一面,网页客户端每隔500毫秒就向服务器发起ssl请求,请求当前的二维码是否被其他客户端(手机)授权,如果返回结果是201,就是说明已经获取扫描二维码终端相同的账号登录授权,如果是其他情况就再隔500毫秒再循环发请求。这个过程会一直持续到二维码被扫描通过或者二维码超时(失效)为止。

 其中使用的工具有: 抓包工具 Fidller ,Chrome F12开发人员工具,注意偶然的发现,微信的客户端有一个min-webmm1cba21.js ,其中清晰可见的XSS filter规范, 这对于那些喜欢白盒测试XSS的鸽子又有希望拿Q仔了!!!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多支持Myblog。

原文地址:http://www.jb51.net/article/87250.htm

这篇文章主要大家详细解析了微信QQ的二维码登录原理js代码,
具有一定的参考价值,感兴趣的小伙伴们可以参考一下

在很多地方就是都出现了使用二维码登录,二维码付款,二维码账户等应用(这里的二维码种马,诈骗就不说了),

二维码验证,多终端辅助授权应用开始多起来,这里先说下啥是二维码,其实二维码就是存了二进制数据的黑白图片,

当出现要求二维码登录的时候,服务器会生成一条临时的唯一的二维码信息,发送到客户端以二维码(图片)的形式写入到网页,

然后你就会看到统一的四个方形的二维码,如果做的好这个二维码信息应该是有时效的,这里暂且不考虑这些,

就简单的微信登录作为例子看看吧:

 

首先说下整个授权流程:

在客户端网页中会不断向服务器发送https连接,并且这里传输很少的数据之后就断开连接了,下面看下微信网页中这个login1c709c.js文件:

 

[html] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. (function($, _aoWin) {  
  2.    
  3.  _aoWin.QRLogin = {};  
  4.   _aoWin.LoginLog = "";  
  5.  var _sBaseHost = "",  
  6.     _oLoginQrCodeImg = document.getElementById("loginQrCode");  
  7.  if (document.domain == "qq.com") {  
  8.  _sBaseHost = "weixin.qq.com";  
  9.  } else if(location.hostname.match(/(wechat\.com)$/)){  
  10.  _sBaseHost = "wechat.com";  
  11.  }else{  
  12.     _sBaseHost = "wechatapp.com";  
  13.   }  
  14.    
  15.  var show_tip = 1,  
  16.  _sCurUUId,  
  17.  _oResetTimeout,  
  18.     _aWebMMCallbacks = [],  
  19.     _oDetactWebMMInterval = setInterval(function(){  
  20.       if(_aoWin.WebMM){  
  21.         clearInterval(_oDetactWebMMInterval);  
  22.         var callback;  
  23.         while(callback = _aWebMMCallbacks.shift()){  
  24.           if(typeof(callback) != "function") continue;  
  25.           callback();  
  26.         }  
  27.       }  
  28.     }, 1000);  
  29.    
  30.   function _logInPage(_asLog){  
  31.     _aoWin.LoginLog = LoginLog + _asLog + "\n";  
  32.   }  
  33.    
  34.   function _afterLoadWebMMDo(callback){  
  35.     if(!_aoWin.WebMM){  
  36.       _aWebMMCallbacks.push(callback);  
  37.     }else{  
  38.       callback();  
  39.     }  
  40.   }  
  41.    
  42.   function _reportNow(text){  
  43.     _logInPage(text);  
  44.     _afterLoadWebMMDo(function(){  
  45.       WebMM.ossLog({Text: text});  
  46.       WebMM.flushOssLog();  
  47.     });  
  48.   }  
  49.    
  50.   var reLoadQRImgCount = 0,  
  51.     loadQRCodeTime = 0,  
  52.     loadQRImgSucc = function(){  
  53.       clearInterval(loadQRImgWatchDog);  
  54.       _logInPage("Load QRCode Success, time=" + (new Date().getTime() - loadQRCodeTime) + "ms, reload count: " + reLoadQRImgCount);  
  55.     },  
  56.     loadQRImgFail = function(img){  
  57.       _reportNow("Load QRcode fail!" + status + ", src: " + img.src + ", time: " + (new Date().getTime() - loadQRCodeTime) + "ms");  
  58.     },  
  59.     loadQRImgWatchDog = null;  
  60.  function _loadQRImg(uuid) {  
  61.     _poll(uuid);  
  62.     _logInPage("Load QRCode Start");  
  63.     loadQRCodeTime = new Date().getTime();  
  64.    
  65.     _oLoginQrCodeImg.onload = function(){  
  66.       loadQRImgSucc();  
  67.       _oLoginQrCodeImg.onload = null;  
  68.     };  
  69.     _oLoginQrCodeImg.onerror = function(){loadQRImgFail(this)};  
  70.     _oLoginQrCodeImg.src = "https://login."+_sBaseHost+"/qrcode/"+uuid+"?t=webwx";  
  71.    
  72.     loadQRImgWatchDog = setInterval(function(){  
  73.       if (reLoadQRImgCount >= 5) {  
  74.         _reset();  
  75.         return;  
  76.       }  
  77.       reLoadQRImgCount++;  
  78.    
  79.       var _img = new Image();  
  80.       _img.onload = function () {  
  81.         if(!_oLoginQrCodeImg.onload) return;  
  82.    
  83.         _oLoginQrCodeImg.onload = null;  
  84.         _oLoginQrCodeImg.src = this.src;//replace  
  85.         loadQRImgSucc();  
  86.       };  
  87.       _img.onerror = function(){loadQRImgFail(this)};  
  88.       _img.src = _oLoginQrCodeImg.src + "&r=" + new Date().getTime();  
  89.     }, 5000);  
  90.   }  
  91.    
  92.   var _sSecondRequestTime = 0,  
  93.     _nAjaxTimeout = 100 * 1000,  
  94.     _nNewLoginFuncErrCount = 0;  
  95.  function _poll(_asUUID) {  
  96.  var _self = arguments.callee,  
  97.       _nTime = 0;  
  98.  _sCurUUId = _asUUID;  
  99.    
  100.     _logInPage("_poll Request Start, time: " + new Date().getTime());  
  101.     _nTime = new Date().getTime();  
  102.  $.ajax({  
  103.  type: "GET",  
  104.  url: "https://login." + _sBaseHost + "/cgi-bin/mmwebwx-bin/login?uuid=" + _asUUID + "&tip=" + show_tip,  
  105.  dataType: "script",  
  106.  cache: false,  
  107.  timeout: _nAjaxTimeout,  
  108.  success: function(data, textStatus, jqXHR) {  
  109.       _logInPage("_poll Request Success, code: " + window.code + ", time: " + (new Date().getTime() - _nTime) + "ms");  
  110.   switch (_aoWin.code) {  
  111.   case 200:  
  112.         _sSecondRequestTime = new Date().getTime() - _sSecondRequestTime;  
  113.         _logInPage("Second Request Success, time: " + _sSecondRequestTime + "ms");  
  114.   clearTimeout(_oResetTimeout);  
  115.    
  116.         var _fNewLoginFunc = function(){  
  117.           $.ajax({  
  118.             url: _aoWin.redirect_uri + "&fun=new",//new login page  
  119.             type: "GET",  
  120.             success:function(msg) {  
  121.               _logInPage("new func reponse, reponseMsg: " + msg);  
  122.               var code = msg.match(/<script>(.*)<\/script>/);  
  123.               var skey=msg.match(/<skey>(.*)<\/skey>/);  
  124.               if(code){  
  125.                 eval(code[1]);  
  126.               }else{  
  127.                 $("#container").show();  
  128.                 $("#login_container").hide();  
  129.               }  
  130.               if(skey && skey[1]){  
  131.                WebMM.model("account").setSkey(skey[1]);  
  132.               }  
  133.             },  
  134.             error:function(jqXHR, textStatus, errorThrown){  
  135.               _nNewLoginFuncErrCount++;  
  136.               if(_nNewLoginFuncErrCount > 5){  
  137.                 if(confirm("Call new login page func error, refresh?")){location.reload()}  
  138.                 return;  
  139.               }  
  140.               _reportNow(_aoWin.redirect_uri + " New login page func error: " + textStatus +" retryCount:" + _nNewLoginFuncErrCount);  
  141.               setTimeout(_fNewLoginFunc, 500);  
  142.             }  
  143.           });  
  144.         };  
  145.         _fNewLoginFunc();  
  146.    
  147.         _reportNow("/cgi-bin/mmwebwx-bin/login, Second Request Success, uuid: " + _asUUID + ", time: " + _sSecondRequestTime + "ms");  
  148.   break;  
  149.    
  150.   case 201:  
  151.         clearTimeout(_oResetTimeout);  
  152.   show_tip = 0;  
  153.   $('.errorMsg').hide();  
  154.   $('.normlDesc').hide();  
  155.   $('.successMsg').show();  
  156.         _reportNow("/cgi-bin/mmwebwx-bin/login, First Request Success, uuid: " + _asUUID);  
  157.         _reportNow("/cgi-bin/mmwebwx-bin/login, Second Request Start, uuid: " + _asUUID);  
  158.    
  159.         _sSecondRequestTime = new Date().getTime();  
  160.    
  161.         //_nAjaxTimeout = 5 * 1000;  
  162.         _self(_asUUID);  
  163.         break;  
  164.    
  165.   case 408:  
  166.   setTimeout(function(){  
  167.    _self(_asUUID);  
  168.   }, 500);  
  169.   break;  
  170.    
  171.   case 400:  
  172.   case 500:  
  173.         _reset();  
  174.         _afterLoadWebMMDo(function(){  
  175.    _aoWin.Log.d("500, Login Poll Svr Exception");  
  176.   });  
  177.   break;  
  178.   }  
  179.  },  
  180.  error: function(jqXHR, textStatus, errorThrown) {  
  181.   if (textStatus == 'timeout') {  
  182.         setTimeout(function(){  
  183.           _self(_asUUID);  
  184.         }, 500);  
  185.   } else {  
  186.         setTimeout(function(){  
  187.           _self(_asUUID);  
  188.         }, 5000);  
  189.    
  190.         _logInPage("_poll Request Error:" + textStatus);  
  191.         _afterLoadWebMMDo(function(){  
  192.           _aoWin.Log.e("Login Poll Error:" + textStatus);  
  193.         });  
  194.   }  
  195.  }  
  196.  });  
  197.  }  
  198.    
  199.   var getUUIDCount = 0,  
  200.     _getUUIDWatchDog,  
  201.     _bGetUUIDSuccess = false;//ajax successִ  
  202.  function _getUUID() {  
  203.     getUUIDCount++;  
  204.     var _self = arguments.callee,  
  205.       _loadError = function(errorText){  
  206.         _reportNow("Load UUID Error! ErrorText: " + errorText + " getUUIDCount=" + getUUIDCount);  
  207.         if(getUUIDCount > 5){  
  208.           if (confirm("Load uuid error. Refresh?")) {  
  209.             location.reload();  
  210.           }  
  211.         }  
  212.         setTimeout(function(){  
  213.           _self();  
  214.         }, 500);  
  215.       };  
  216.    
  217.     clearTimeout(_getUUIDWatchDog);  
  218.     _getUUIDWatchDog = setTimeout(function(){  
  219.       if(!_aoWin.QRLogin.code){  
  220.         _logInPage("GetUUID Timeout, WatchDog Run");  
  221.         _self();  
  222.       }  
  223.     }, 10000);  
  224.    
  225.     $.ajax({  
  226.       type: "GET",  
  227.       url: "https://login." + _sBaseHost + "/jslogin?appid=wx782c26e4c19acffb&redirect_uri="+encodeURIComponent(location.protocol+"//"+location.host+"/cgi-bin/mmwebwx-bin/webwxnewloginpage")+"&fun=new&lang=" + document.lang,  
  228.       dataType: "script",  
  229.       cache: false,  
  230.       success : function(){  
  231.         clearTimeout(_getUUIDWatchDog);  
  232.         if(_bGetUUIDSuccess) return;  
  233.         if (_aoWin.QRLogin && _aoWin.QRLogin.code == 200) {  
  234.           _logInPage("GetUUID Success, UUID=" + QRLogin.uuid);  
  235.           _bGetUUIDSuccess = true;  
  236.    
  237.           clearTimeout(_oResetTimeout);  
  238.           _oResetTimeout = setTimeout(function(){  
  239.             location.reload();//Note: Don't run _reset(). If you run _reset(), there will may have many _poll request, as they get 408 return code  
  240.           }, 5 * 60 *1000);//5 mins  
  241.    
  242.           _loadQRImg(QRLogin.uuid);  
  243.         } else {  
  244.           var QRLoginCode = (_aoWin.QRLogin && _aoWin.QRLogin.code) ? _aoWin.QRLogin.code : "None";  
  245.           _logInPage("GetUUID Error, QRLogin.code=" + QRLoginCode);  
  246.           _loadError("QRLogin.code= " + QRLoginCode);  
  247.         }  
  248.       },  
  249.       error : function(xhr, textStatus, errorThrown){  
  250.         _logInPage("GetUUID Error, textStatus=" + textStatus);  
  251.         _loadError(textStatus);  
  252.       }  
  253.     });  
  254.  }  
  255.    
  256.   function _reset(){  
  257.     location.reload();  
  258.   }  
  259.    
  260.  if ($("#login_container").is(":visible") ) {  
  261.     _getUUID();  
  262.  }  
  263.    
  264.     
  265.  var _bHadLog = false;  
  266.  function _ossLog() {  
  267.  if (_bHadLog) return;  
  268.  _bHadLog = true;  
  269.  var _sUvid = document.cookie.match(new RegExp( "(^| )"+"webwxuvid"+"=([^;]*)(;|$)"));  
  270.     if(!_sUvid || _sUvid.length < 3) return;  
  271.     _sUvid = _sUvid[2];  
  272.  (new Image()).src = "/cgi-bin/mmwebwx-bin/webwxstatreport?funkey=indexdemo&uvid="+_sUvid+"&uuid="+_sCurUUId;  
  273.  }  
  274.    
  275.    
  276.  if($("img.guide").length > 0) {  
  277.  var _nTimer = 0,  
  278.   _oGuide$ = $(".guide"),  
  279.   _oGuideTrigger$ = $("#guideTrigger, #tipTrigger"),  
  280.   _oMask$ = $(".mask");  
  281.    
  282.   function _back() {  
  283.   _nTimer = setTimeout(function() {  
  284.   _oMask$.stop().animate({opacity:0}, function(){$(".mask").hide()});  
  285.   _oGuide$.stop().animate({marginLeft:"-120px",opacity:0}, "400", "swing",function(){  
  286.    _oGuide$.hide();  
  287.   });  
  288.   }, 100);  
  289.  }  
  290.    
  291.  /*guide*/  
  292.  _oGuide$.css({"left":"50%", "opacity":0});  
  293.  _oGuideTrigger$.css({"backgroundColor":"white", "opacity":"0"});  
  294.  _oGuideTrigger$.mouseover(function(){  
  295.   clearTimeout(_nTimer);  
  296.   _oMask$.show().stop().animate({"opacity":0.2});  
  297.   _oGuide$.css("display", "block").stop().animate({marginLeft:"+168px", opacity:1}, 900, "swing", function() {  
  298.   _oGuide$.animate({marginLeft:"+153px"}, 300);  
  299.   });  
  300.   _ossLog();  
  301.  }).mouseout(_back);  
  302.    
  303.  _oGuide$.mouseover(function(){  
  304.   clearTimeout(_nTimer);  
  305.  }).mouseout(_back);  
  306.  }  
  307. })(jQuery, window);  

 

 

细读js之后,你就会从网页客户端这边看到请求登录的一面,网页客户端每隔500毫秒就向服务器发起ssl请求,请求当前的二维码是否被其他客户端(手机)授权,如果返回结果是201,就是说明已经获取扫描二维码终端相同的账号登录授权,如果是其他情况就再隔500毫秒再循环发请求。这个过程会一直持续到二维码被扫描通过或者二维码超时(失效)为止。
 其中使用的工具有: 抓包工具 Fidller ,Chrome F12开发人员工具,注意偶然的发现,微信的客户端有一个min-webmm1cba21.js ,其中清晰可见的XSS filter规范, 这对于那些喜欢白盒测试XSS的鸽子又有希望拿Q仔了!!!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多支持Myblog。

原文地址:http://www.jb51.net/article/87250.htm

posted @ 2017-03-08 15:50  星火卓越  阅读(1020)  评论(0编辑  收藏  举报