12306登录分析
本文制作研究使用
12306的登錄的賬號和密碼都是明文的方式提交的,沒有做任何的加密,但是,直接模擬的話是會失敗.原因是在cookies里面做了文章
首先還是看抓包:
GET https://kyfw.12306.cn/otn/HttpZF/logdevice?algID=SVHBuOPJ2a&hashCode=QtyAPU_LKy3M5hXdOfHzWcsNngNKxEBIg9_3r4Guu8g&FMQw=1&q4f3=zh-CN&VySQ=FGGEB0cu0YuC_ol_icmwwDB0c-ozV84j&VPIf=1&custID=133&VEek=1&dzuS=0&yD16=0&EOQP=49a9fbfe2beb0490836324ceb234fef4&lEnu=1677787516&jp76=52d67b2a5aa5e031084733d5006cc664&hAqN=Win32&platform=WEB&ks0Q=d22ca0b81584fbea62237b14bd04c866&TeRS=1040x1920&tOHY=24xx1080x1920&Fvje=i1l1o1s1&q5aJ=-8&wNLf=99115dfb07133750ba677d055874de87&0aew=Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/74.0.3729.169%20Safari/537.36&E3gR=7b12a5199663f2c8fe49a613800c66eb×tamp=1569745103039 HTTP/1.1 Host: kyfw.12306.cn Connection: keep-alive Pragma: no-cache Cache-Control: no-cache User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36 DNT: 1 Accept: */* Referer: https://kyfw.12306.cn/otn/resources/login.html Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9 Cookie: JSESSIONID=BF45E1688711F0463042C25E83C0B0A2; BIGipServerotn=200278538.50210.0000; route=6f50b51faa11b987e576cdb301e545c4
是這么一串的東西,實際實際上是記錄了瀏覽器的一些信息加密成的.
分析:
首先找到加密的代碼塊:
完整的js加密在https://kyfw.12306.cn/otn/HttpZF/GetJS中,我們需要找到m的各個對象值 :
其實這一部分可以寫死的,不過這個不是我們的目的,我們的目的是分析下加密的過程.
首先"DOMContentLoaded"事件觸發了Qa函數
這里的操作實際是去提取瀏覽器指紋信息
然后初始化
這部分工作做的是獲取硬件的信息:
檢驗瀏覽器的部分基本信息:
隨后將這部分信息放在一個array中getDfpMoreInfo
拿到這些硬件的信息后,進行最終的組裝:
通過hashAlg函數進行一個加密,得到唯一一個串.
這樣就可以得到了正確的url了,拿著這個url去請求,會的正確的參數,并且加到cookies中去.就可以正確的登錄了
最后以為這樣就可以結束了,高興的把代碼改成了再node中可以執行的代碼后,結果發現12306第二天就不能用了,原來hashAlg的加密代碼被改掉了
也就是12306每天都會修改都會hashAlg函數…
這個也導致一個很不友好的BUG:
如果你昨天登陸了12306,今天再來嘗試登陸的話,點擊登陸按鈕會出現沒有反應,因為Getjs這個已經在瀏覽器的緩存里面了,沒有更新到最新的js,但是后臺的校驗方式更新了,用戶體驗極差.
類似的有支付寶的登錄,但是支付寶的登錄會失敗,然后重新請求加密的js代碼.所以規避了這個問題.
所以最后沒有辦法,hashAlg函數被壓縮了,a,b,c,d不能正則替換,只能把完整的Getjs代碼拿出來,然后將不適合再nodejs中的代碼使用正則替換掉,當做字符串用eval執行
eval(js_code)這樣就解決了js代碼頻繁更新的問題了.
完.
總結
- 上一篇: TOGAF认证考试总结
- 下一篇: 适配器模式(Adapter Class/