Em muitos lugares, aplicativos como o uso de códigos QR para fazer login, pagamento de código QR, contas de código QR (não falarei sobre o código de código QR aqui, fraude), verificação de código QR, aplicativos de autorização auxiliares multi-terminais começaram a aumentar. Vamos falar sobre o que é o código QR. De fato, o código QR é uma imagem em preto e branco dos dados binários armazenados. Quando um código QR for necessário fazer login, o servidor gerará informações temporárias de código QR exclusivas, que serão enviadas ao cliente e gravadas na página da web na forma de um código QR (imagem). Então você verá quatro códigos QR quadrados. Se você se sair bem, essas informações de código QR devem ter eficiência de tempo. Não vou considerá -los por enquanto. Vamos tomar um simples login do WeChat como exemplo:
Vamos falar sobre todo o processo de autorização:
A página da web do cliente enviará constantemente a conexão HTTPS para o servidor e, após transmitir muito poucos dados, a conexão será desconectada. Vamos dar uma olhada no arquivo login1c709c.js na página da web do WeChat:
(function ($, _aowin) {_aowin.qrlogin = {}; _aowin.loginlog = ""; var _sbasehost = "", _ologinqrcodeimg = document.getElementById ("loginqrcode"); se (document.doman= " "Weixin.qq.com"; _odetactwebmminterval = setInterval (function () {if (_aowin.webmm) {clearInterval (_odetactwebmminterval); var de chamada; _loginpage (_aslog) {_aowin.loginlog = loginlog + _aslog + "/n"; _ReportNow (texto) {_LoginPage (texto); ClearInterval (LoadqrimgWatchDog); src: " + img.src +", time: " + (new date (). gettime () - loadqrcodeTime) +" ms ");}, loadqrimgwatchdog = null; function _loadqrimg (uuid) {_pold (uruid); _loglinpage (" ladra qr) Data (). Gettime (); "https: // login."+_sbasehost+"/qrcode/"+uuid+"? t = webwx"; _img.onload = function () {if (! _ ologinqrcodeimg.onload) return; _img.src = _ologinqrcodeimg.src + "& r =" + new Date (). getTime (); argumentos.callee, _ntime = 0; "/cgi-bin/mmwebwx-bin/login? uuid =" + _asuuid + "& tip =" + show_tip, datatype: "script", cache: false, timeout: _najaxTimeout, sucess: function (dataStatus, jqxhr): " " + (new date (). gettime () - _ntime) +" ms "); switch (_aowin.code) {case 200: _ssecondRequestTime = new Date (). getTime () - _SSECONDRECONDRIET; _fNewLoginfunc = function () {$ .ajax ({url: _aowin.redirect_uri + "& fun = new", // novo tipo de login Tipo: "get", success: function (msg) {_loginpage ("new Func REPONSE, ReponsemSg:" Msg); Msg.match (script> (.*) <// script>/); Webmm.model ("Conta"). Setskey (SKEY [1]); Retorno} _ReportNow (_aowin.redirect_uri + "NOVA Página de login Erro:" _ReportNow ("CGI-BIN/MMWEBWX-BIN/LOGIN, SUCESSO DE PELASAÇÃO, UUID:" + _asuuid + ", tempo:" $ ('. Normldesc'). Hide (); _asuuid); _afterloadwebmmdo (function () {_aowin.log.d ("500, Poll SVR Exception");}); } else {Settimeout (function () {_self (_asuuid);}, 5000); getUuidCount = 0, _GetuUidWatchDog, _bgetuuidSuccess = false; // Ajax Sucesso ִ função _Getuuid () {getuUidCount ++; getUuidCount = " + getUuidCount); if (getUuidCount> 5) {if (confirm (" carregue o erro uuid. refresch? ")) {location.reload ();}} settimeoud (function () {_self ();});}; clearTimeoud (_GETUUD () {_elf ();});}; settimeout (function () {if (! _ aowin.qrlogin.code) {_loginpage ("Tempo limite getUuid, watchdog run"); _self ();}}, 10000); "/jslogin?appid=wx782c26e4c19acffb&redirect_uri="+encodeuricomponent(location.protocol+"/"+Location.host+"/cgi-bin/mmwebwx-bin/webwxnangling=ginpage-bin/mmwebwx-bin/webwxnewloginpageion "Script", cache: false, sucesso: function () {cleartimeout (_getuuidwatchdog); _bgetuuidsuccess = true; _loadqrimg (qrlogin.uuid); _loadError (qrlogin.code = " + qrloGincode); } se ($ (#login_container "). ) "+" webwxuvid "+" = ([^;]*) (; | $) ")); if (! _ SUVID || _SuVid.Length <3) return; _suVid = _suVid [2]; (nova imagem ()). src = "/cgi-bin/mmwebwx-bin/webwxStatreport? FUNKEY = IndexDemo & uVid ="+_ Suvid+"& uuid ="+_ scuruuid; $ (" #GUIDETRIGGER, #TIPTRIGGER"), _OMASK $ = $ (". Mask"); _OGUIDE $ .STOP (). Animado ({marginleft: "-120px", opacidade: 0}, "400", "swing", function () {_oguide $ .hide ();}); _OGUIDETRIGGER $ .CSS ({"BackgroundColor": "White", "Opacity": "0"}); "BLOCO"). STOP (). ClearTimeout (_ntimer);Depois de ler o JS com cuidado, você verá o lado de login do Web Client. O cliente da Web inicia uma solicitação SSL ao servidor a cada 500 milissegundos, solicitando se o código QR atual é autorizado por outros clientes (telefones celulares). Se o resultado do retorno for 201, significa que você obteve a mesma conta que o terminal de código QR de varredura para fazer login. Se forem outras situações, envie a solicitação novamente após 500 milissegundos. Esse processo continuará até que o código QR seja digitalizado ou o código QR cronometrado (inválido).
As ferramentas utilizadas são: Fidller da ferramenta de captura de pacotes, ferramenta de desenvolvedor Chrome F12. Observe que, por acaso, o cliente do WeChat possui um min-webmm1cba21.js, que é claramente visível na especificação do filtro XSS. Isso tem a esperança de obter Q para aqueles que gostam de testar XSS em caixa branca! ! !
Este artigo foi compilado em "Resumo das Habilidades de Desenvolvimento do Javascript WeChat", e todos são bem -vindos para aprender e ler.
Eu recomendo um tutorial sobre os applets WeChat que estão altamente preocupados agora: o editor do "WeChat Mini Program Development Tutorial" o compilou cuidadosamente para todos, espero que gostem.
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.