抓包的工具有很多,瀏覽器的開發者工具、Fiddler、Wireshark等等,這里以Chrome的開發者工具舉例。
刪除Cookies
方便分析,我們先打開開發者工具,將博客園的cookie刪除
刪除Cookies
登錄頁Cookie
博客園的登錄頁面是https://passport.cnblogs.com/user/signin,直接訪問這個頁面,然后看網絡請求
登錄頁請求
可以看到先訪問了https://passport.cnblogs.com/user/signin,狀態碼是302,又重定向到https://passport.cnblogs.com/user/signin?AspxAutoDetectCookieSupport=1,還是這個頁面,只是多加了參數AspxAutoDetectCookieSupport=1
,分別看這兩個請求的返回內容
/user/signin
/user/signin?AspxAutoDetectCookieSupport=1
訪問第一個請求時服務器向瀏覽器返回了 AspxAutoDetectCookieSupport
和 SERVERID
兩個Cookie,而第二個請求,也是返回了 SERVERID
這個Cookie,暫時認為這個請求對我們沒有幫助
登錄請求
輸入賬號密碼,然后點登錄,看請求的報文
登錄請求
有幾個需要注意的地方
-
Content-Type
使用了application/json的方式 - 登錄頁返回的兩個Cookie要帶上
- 有個
VerificationToken
頭 - 賬號密碼的參數分別是
input1
和input2
,并且做了加密處理,remember
是記住密碼 - 實踐發現
X-Requested-With
也是必須的,否則登錄報錯
要知道VerificationToken
和input1
、input2
值的由來,我們定位到登錄按鈕的事件
登錄按鈕事件
調用了signin_go
函數,找到這個函數,看它所做的事情
signin_go函數
代碼很清晰,到這里,除去驗證碼的部分,結合請求報文,登錄的過程已經很清楚了
- GET請求https://passport.cnblogs.com/user/signin頁面,拿到
AspxAutoDetectCookieSupport
和SERVERID
兩個Cookie - 使用了 JSEncrypt 根據RSA公鑰加密用戶名與密碼作為
input1
、input2
參數 - 設置請求頭
ContentType
和VerificationToken
還有X-Requested-With
,并帶上前面兩個Cookie - 將
input1
、input2
、remember
轉換為json,發送POST請求,返回的JSON數據success為true表示登錄成功 - 登錄成功后返回
.CNBlogsCookie
Cookie,也就是用戶身份的Cookie
模擬登錄
為了驗證我們的分析,使用Postman工具模擬一下登錄的過程
設置4個必要的請求頭
Postman請求頭
因為Content-Type是application/json方式,所以表單使用raw
,填入登錄的json參數
Postman表單
然后提交,返回了登錄成功的JSON
登錄成功