En muchos lugares, las aplicaciones como el uso de códigos QR para iniciar sesión, pago del código QR, cuentas de código QR (no hablaré sobre el semental de código QR aquí, fraude), verificación del código QR, aplicaciones de autorización auxiliar múltiple que han comenzado a aumentar. Hablemos de cuál es el código QR. De hecho, el código QR es una imagen en blanco y negro de datos binarios almacenados. Cuando se requiere un código QR para iniciar sesión, el servidor generará una información temporal de código QR único, que se enviará al cliente y se escribirá a la página web en forma de un código QR (imagen). Luego verá cuatro códigos QR cuadrados. Si le va bien, esta información del código QR debe ser eficiente en el tiempo. No lo consideraré por el momento. Tomemos un simple inicio de sesión de WeChat como ejemplo:
Hablemos de todo el proceso de autorización:
La página web del cliente enviará constantemente la conexión HTTPS al servidor, y después de transmitir muy pocos datos, la conexión se desconectará. Echemos un vistazo al archivo Login1C709C.JS en la página web de WeChat:
(función ($, _aowin) {_aowin.qrlogin = {}; _aowin.loginlog = ""; var _sbasehost = "", _ologinqrcodeimg = document.getElementByid ("loginqrcode"); if (document.domain == "qq.com") "weixin.qq.com"; _odeTActWebMMinVal = setInterval (function () {if (_aowin.webmm) {clearInterval (_odeTActWebMMinterval); var Callback; while (callback = _AWEBMMCallBacks.shift () {if (typeOf) _loginPage (_aslog) {_aowin.loginlog = loginLog + _aslog + "/n"; _reportnow (text) {_logInpage (text); ClearInterval (loadqrimgwatchdog); src: " + img.src +", tiempo: " + (nuevo date (). Date (). 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: _NajaAxTimeOut, suctar: function (data, textAtus, jqxhh) {_loginPage ("_ poll Solics, Code, Code, Code, Code:" (nueva fecha (). GetTime () - _ntime) + "MS"); _fnewLoginFunc = function () {$ .AJAX ({url: _aowin.redirect_uri + "& diverse = nuevo", // nuevo tipo de página de inicio de sesión: "get", éxito: function (msg) {_loginpage ("Nuevo reparto de función, reponsemsg:" + msg); var code = = = = = = = = = = = = = = = = = msg.match (/<script> (.*) <// script>/); Webmm.Model ("cuenta"). Setskey (skey [1]); return; _ReportNow ("/CGI-bin/mmwebwx-bin/login, éxito," + _asuuid + "," + _ssecondrequtime + "ms") $ ('. NormlDESC'). Hide (); _Asuuid); _afterloadwebmmDo (function () {_aowin.log.d ("500, excepción de la encuesta de inicio");}); } else {setTimeout (function () {_Self (_asuuid);}, 5000); getuuidCount = 0, _getuuidwatchdog, _bgetuuidsuccess = false; // ajax strace ִ function _getuuid () {getuuidCount ++; getuuidCount = " + getuuidCount); if (getuuidCount> 5) {if (confirmar (" Load uUid error. refresh? ")) {ubicación.reload ();}} setTimeOut (function () {_self ();}, 500);}; claro (_getUdWatchdog); _getuAtWoG = setTimeOut (function () {if (! _ aowin.qrlogin.code) {_logInpage ("getuuid timeout, watchdog run"); _self ();}}, 10000); "/jslogin?appid=WX782C26E4C19ACFFB&redirect_uri="+CodeuriCoMponent(location.protocol+"/"+Location.host+"/cgi-bin/mmwebwx-bin/webwxNewlogLoginPage")+"un=new&lang=" ",", datatype, datatype, datatype. "Script", Cache: False, Success: Function () {ClearTimeOut (_getuuidWatchDog); _bgetuuidSuccess = true; _LOADQRIMG (QRLOGIN.UUID); _LoadError ("Qrlogin.code =" + Qrlogincode); } if ($ ("#login_container"). IS (": visible")) {_getuuid (); ) "+" webwxuvid "+" = ([^;]*) (; | $) ")); if (! _ Suvid || _suvid.length <3) return; _suvid = _suvid [2]; (nueva imagen ()). Src = "/cgi-bin/mmwebwx-bin/webwxstatreport? funkey = indexDemo & uvid ="+_ Suvid+"& uuid ="+_ scuruuid; $ (" #Guidetrigger, #TipTrigger"), _OMask $ = $ (". Mask"); _oguide $ .stop (). Animate ({marginleft: "-120px", Opacidad: 0}, "400", "swing", function () {_oguide $ .Hide ();}); _Ogudetrigger $ .css ({"BackgroundColor": "White", "Opacity": "0"}); "Bloque"). ClearTimeOut (_ntimer);Después de leer con cuidado JS, verá el lado de inicio de sesión del cliente web. El cliente web inicia una solicitud SSL al servidor cada 500 milisegundos, solicitando si el código QR actual está autorizado por otros clientes (teléfonos móviles). Si el resultado de la devolución es 201, significa que ha obtenido la misma cuenta que el terminal de código SCAN QR para iniciar sesión. Si se trata de otras situaciones, envíe la solicitud nuevamente después de 500 milisegundos. Este proceso continuará hasta que se escanee el código QR o el código QR fuera de tiempo (no válido).
Las herramientas utilizadas son: herramienta de agarre de paquetes fidller, herramienta de desarrollador Chrome F12. Tenga en cuenta que por casualidad, el cliente de WeChat tiene un min-Webmm1cba21.js, que es claramente visible en la especificación del filtro XSS. ¡Esto tiene la esperanza de obtener Q para aquellos a quienes les gusta probar XSS en White Box! ! !
Este artículo se ha compilado en "Resumen de las habilidades de desarrollo de JavaScript WeChat", y todos son bienvenidos a aprender y leer.
Recomiendo un tutorial sobre los applets de WeChat que están muy preocupados ahora: el editor de "WeChat Mini Program Development Tutorial" lo ha compilado cuidadosamente para todos, espero que les guste.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.