Nagu me kõik teame, kasutas Tencent QQ kiire sisselogimise rakendamiseks Activex-i, kasutades seda tundmatus brauseris, ja esimene asi, mida teha, oli QuickLogin kontroll paigaldada.
Just siis, kui ma ei tea millal, siis kiire sisselogimine ei vaja enam juhtnuppe.
Sel ajal olin väga segaduses, millist kummalist meetodit Tencent kasutas kohalike rakendustega suhtlemiseks?
Ilma pluginateta ei tohiks veebilehed suuta otse kohalike rakendustega suhelda (välja arvatud juhul, kui protokoll on määratletud, kuid seda saab kutsuda ainult esile, mitte programmi poolt antud tulemusi).
Juhuslikult (noh, lihtsalt tüdines tegumikuhaldurit vaadates ja avastades kohaliku httpd ning avastades Apache'i töötamas) sain äkki võimaluse avastada: kui QQ avab kohaliku pordi, loob veebiserveri, st TCP serveri, mis vastab HTTP protokollile, ja siis veebileht ajax teeb päringu sellele QQ-le (praegu veebiserverina), kas saad tulemuse?
Ja see ongi tegelikult tulemus.
Web JS algatab GET-päringu http://localhost.ptlogin2.qq.com-le (pordid 4300–4308, ükshaaval edu saavutamiseks).
Ping näitab, et see on 127.0.0.1, ja kui pordi kontrollida, on see tõepoolest QQ kasutuses.
Esimene soov: /pt_get_uins?callback=ptui_getuins_CB&r=0.5919004196050326&pt_local_tk=399224727
pt_local_tk küpsist, mis iganes see ka poleks; r on juhuslik arv
Tagastatud tulemus on JSON-massiivi:
var var_sso_uin_list=[{"account":"Logitud QQ kontosse","face_index":-1,"gender":0,"nickname":"Your QQ nickname","uin":"Still your QQ konto","client_type":66818,"uin_flag":8388612}]; ptui_getuins_CB(var_sso_uin_list);
Seejärel kasuta http://ptlogin2.qq.com/getface QQ avataride saamiseks, millest siin ei räägita
Nii saab sinu QQ info veebilehel kuvada.
Kui vajutad avatari (kui valid selle sisselogimise)
Genereeritakse järgmised taotlused:
http://localhost.ptlogin2.qq.com:4300/pt_get_st?clientuin=你的QQ号&callback=ptui_getst_CB&r=0.7293395590126179&pt_local_tk=399224727
Samamoodi on r juhuslik arv, pt_local_tk pärineb küpsisest, local_token
Mida see taotlus teeb?
Noh, Set-Cookie.
Seejärel jätka taotlusega
http://ptlogin2.qq.com/jump?clientuin=你的QQ号&keyindex=19&pt_aid=549000912&daid=5&u1=http%3A%2F%2Fqzs.qzone.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizone&pt_local_tk=1881902769&pt_3rd_aid=0&ptopt=1&style=40
Ainus U1 siin on sihtkoha aadress
See päring tagastab kõik vajalikud küpsised ja oled sisse logitud.
Pärast protokolli õppimist avastati tõsine probleem: mis juhtub, kui (musta südamega) programm teeb neid asju kasutaja nimel?
Alusta kohe!
Mul oli käepärast ainult Mac, nii et kirjutasin selle Obj-C formaadis.
[self GET:@"http://localhost.ptlogin2.qq.com:4300/pt_get_uins?callback=ptui_getuins_CB&r=0.47178753013324637&pt_local_tk=-1211438011" päis:nil];
//这里的GET是我自己封装的一个方法,GET网页上的数据
Märkus: Minu varasema kogemuse põhjal QQ botidega (WebQQ protokolli alusel): Refereri päis on väga oluline (see peab olema .qq.com domeeninimi), kui see on vale, siis see kindlasti ebaõnnestub. Seega siin ringristmikke ei ole
Muide, olin tol ajal Obj-C maailmas uus ja mõned koodid võivad tunduda veidi tobedad, palun andke andeks.
//cookiedata是个NSDictionary
Nii on sisselogimine lõpetatud, leiad QQ ruumi liidese (siin ei postitatud) ja postitus õnnestub.
Mida see tähendab? See tähendab, et seni, kuni programm töötab lokaalselt, on võimalus QQ sisselogimine lõpetada sinu asemel ning teha mõningaid salakavalaid toiminguid platvormidel nagu QQ space, mis ei nõua sekundaarset autentimist
|