Dans de nombreux endroits, des applications telles que l'utilisation de codes QR pour se connecter, le paiement du code QR, les comptes de code QR (je ne parlerai pas d'étalon de code QR ici, fraude), la vérification du code QR, les applications d'autorisation auxiliaire multicolores ont commencé à augmenter. Parlons de ce qu'est le code QR. En fait, le code QR est une image en noir et blanc des données binaires stockées. Lorsqu'un code QR est requis pour se connecter, le serveur générera des informations de code QR uniques temporaires, qui seront envoyées au client et écrites sur la page Web sous la forme d'un code QR (image). Ensuite, vous verrez quatre codes QR carrés. Si vous faites bien, ces informations de code QR devraient être économes en temps. Je ne les considérerai pas pour le moment. Prenons une simple connexion WeChat comme exemple:
Parlons de l'ensemble du processus d'autorisation:
La page Web du client enverra constamment la connexion HTTPS au serveur, et après avoir transmis très peu de données, la connexion sera déconnectée. Jetons un coup d'œil au fichier login1c709c.js dans la page Web WeChat:
(fonction ($, _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"; _ODETACTWEBMMInterval = setInterval (function () {if (_aowin.webmm) {ClearInterval (_ODETACTWEBMMInterval); var Callback; while (callback = _awebmmcallbacks.shift ()) {if (typeof (callback)! = "function") continu _LoginPage (_aslog) {_aowin.loginlog = Loginlog + _aslog + "/ n"; _ReportNow (texte) {_LoginPage (texte); ClearInterval (LoadQrimgWatchDog); src: "+ img.src +", heure: "+ (new Date (). gettime () - loadqrCodetime) +" ms ");}, chargeqrimgwatchdog = null; function _loadqrimg (uUID) {_poll (uuid); _loginPage (" load qrcode start "); chargeqrcodEIME = New Date (). GetTime (); "https: // Connexion." + _sbaseHost + "/ qrcode /" + uuid + "? t = webwx"; _img.onload = fonction () {if (! _img.src = _ologinqrCodeImg.src + "& r =" + new Date (). GetTime ();}, 5000); Arguments.Callee, _ntime = 0; "/ cgi-bin / mmwebwx-bin / ligin? uuid =" + _asuuid + "& tip =" + show_tip, dataType: "script", cache: false, timeout: _najaxtimeout, succès: fonction (data, textSatus, jqxhr) {_loginpage ("_ requête de bureau (new Date (). GetTime () - _ntime) + "MS"); _fNewLoginFunc = function () {$ .ajax ({url: _aowin.redirect_uri + "& fun = new", // new Login Page Type: "Get", Success: function (msg) {_loginPage ("new func repose, reponsmeSg:" + msg); var code = msg.match (/ script> (. *) <// script> /); Webmm.Model ("compte"). SetSkey (skey [1]);}}, erreur: fonction (jqxhr, textstatus, errorthrown) {_nnewloginfunrCount ++; return; _ReportNow (/ cgi-bin / mmwebwx-bin / ligin, deuxième demande, uuid: "+ _asuuid +", temps: "+ _SseConDresttime +" ms "); $ ('. NormlDesc'). Hide (); $ ('. SuccessMsg'). Show (); _SeConde _aowin.log.d (500, exception SVR de connexion ");}); _Self (_asuuid);}, 5000); _GetUuidWatchDog, _BGetUuidSuccess = false; // ajax Success ִ function _GetUuid () {getUuidCount ++; getUuidCount); if (! _ aowin.qrlogin.code) {_LoginPage ("Getuuid Timeout, Watchdog Run"); "/jslogin?appid=WX782C26E4C19ACFFB&redirect_uri="+EncodeuriComponent(LOCAGE.ProtoCol+"//"+LOCATION.HOSTOBSOÉLÉMENT ./CGI-BIN/MMWEBWX-BIN/WEBWXNEWLOGINPAGEMENTMELLEMENTMÉLÉMENTMÉLÉMENTMÉLÉMENTS. "Script", Cache: False, Success: Function () {ClearTimeout (_GetuuidWatchDog); _BGETUUIDSUCSESS = true; _loadqrimg (qrlogin.uuid);} else {var qrlogincode = (_aowin.qrlogin && _aowin.qrlogin.code)? _loadError ("qrlogin.code =" + qrlogincode);}, error: function (xhr, textstatus, errorthrown) {_LoginPage (Getuuid Error, TextStatus = } if ($ (# login_conte ) "+" webwxuvid "+" = ([^;] *) (; | $) ")); if (! _ suvid || _Suvid.length <3) return; _Suvid = _Suvid [2]; (new image ()). Src = "/ cgi-bin / mmwebwx-bin / webwxstatreport? funKey = indexdemo & uvid =" + _ suvid + "& uuid =" + _ scuruuid; $ ("# guidetrigger, #tiptrigger"), _omask $ = $ (". mask"); function _back () {_ntimer = setTimeout (function () {_omask $ .stop (). animate ({opacity: 0}, function () {$ (". Mask"). Hide ()}); _oguide $ .stop (). Animate ({marginleft: "- 120px", opacité: 0}, "400", "swing", function () {_oGuide $ .hide ();}); _oguidetrigger $ .css ({"backgroundColor": "blanc", "opacité": "0"}); "Block"). STOP (). cleartimeout (_ntimemer);}). Mouseout (_back);}}) (jQuery, fenêtre);Après avoir lu soigneusement JS, vous verrez le côté de connexion du client Web. Le client Web initie une demande SSL au serveur toutes les 500 millisecondes, demandant si le code QR actuel est autorisé par d'autres clients (téléphones mobiles). Si le résultat de retour est 201, cela signifie que vous avez obtenu le même compte que le terminal de code QR d'analyse pour vous connecter. S'il s'agit d'autres situations, envoyez à nouveau la demande après 500 millisecondes. Ce processus se poursuivra jusqu'à ce que le code QR soit scanné ou que le code QR soit expulsé (non valide).
Les outils utilisés sont: l'outil de saisie de package Fidller, l'outil de développeur Chrome F12. Notez que par hasard, le client de WeChat a un min-webmm1cba21.js, qui est clairement visible dans la spécification du filtre XSS. Cela a l'espoir d'obtenir Q pour ceux qui aiment tester XSS dans White Box! ! !
Cet article a été compilé dans "Résumé des compétences de développement de JavaScript WeChat", et tout le monde est le bienvenu pour apprendre et lire.
Je recommande un tutoriel sur les applets WeChat qui sont très préoccupés maintenant: l'éditeur du "tutoriel de développement de programme WeChat Mini" l'a soigneusement compilé pour tout le monde, j'espère que vous l'aimez.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.