• 微信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 + "
    ";  
      }  
       
      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 + " ";  
    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

  • 相关阅读:
    php面向对象三大特性
    php面向对象的重写与重载
    一组成对的数字,找出不成对的数字
    如何创建dll以及使用
    常见运行时错误
    连续数的和
    绕圆圈取球
    第一章 概述
    错误2038
    一个简单的环境光shader
  • 原文地址:https://www.cnblogs.com/amylis_chen/p/6519809.html
Copyright © 2020-2023  润新知