HTTPClient模擬登陸開心網001

[size=large][color=blue]網站登陸分類[/color][/size]
[size=medium]
不考慮HTTPS,網站通過瀏覽器登陸大約可以分爲如下幾類
[list]
[*] 密碼明文傳輸,用戶在瀏覽器輸入用戶名密碼,然後用明文傳輸到網站。人人網就是這種做法。
[*] 使用HTTP協議Authentication機制,一般網站使用的少。
[*] 使用JS對用戶輸入的密碼進行處理,網絡上不用傳輸明文密碼了。開心001採用的這種做法。[/list] 另外: 有些網站也提供接口,讓用戶可以編寫客戶端來訪問網站,例如amazon s3。
[/size]


[size=large][color=blue]開心001的登陸開發實踐[/color][/size]

[size=medium]和人人一樣,我在做開心001登陸開始的時候也是使用badboy錄製登陸過程,用jmeter重放。發現登陸時並沒有直接發送密碼明文,而是用如下兩個參數代替:[/size]
[quote]encypt
rpasswd[/quote]
[size=medium]猜測開心可能使用了一個encyptKey(encypt)對用戶輸入的密碼進行處理,生成一個rpasswd。通過firebug追蹤登陸過程,證實了這個猜想:[color=red]如果用戶沒有登陸,每次訪問登陸頁面時,服務器會發一個encyptKey到客戶端,返回在網頁裏(保存成javascript變量的形式),用戶輸入密碼並提交後,會運行一段js代碼,這段代碼會使用encyptKey對密碼進行處理,生成rpasswd參數發送給服務器進行校驗。[/color]由於每次訪問登陸頁面服務器返回的驗證碼不同,這就使得你在某次錄製產生的參數下次就不能登陸。

發現這個問題後,嘗試瞭如下解決方法:
[list]
[*] HTTPClient是否能夠模擬點擊按鈕,也就是說用HTTPClient完全模擬用戶登陸全過程。遺憾的是,HTTPClient並不支持這個功能。
[*] 是否有其它工具。HTTPUnit可以用了模擬用戶點擊,但是下載嘗試以後,發現HTTPUnit並不好用,這條路沒有嘗試成功。
[*] 在java中實現開心001網頁裏js要實現的功能,也就是:首先分析出encyptKey,然後用這個encyptKey加上自己實現js功能部分產生rpasswd,再發送到服務器驗證。但是開心001關於驗證的js100多行,涉及大量位運算,在java裏無bug的實現還是需要相當工作量的。
[*] 經過仔細考慮,想到: 如果在java裏面可以調用js,那麼直接調用js的功能產生rpasswd不就可以了嗎? 很快就找到rhino這個工具,實踐中這個工具非常好用,讓人再一次感到了做java程序員的快樂 :)
[/list][/size]
[size=large][color=blue]最終的登陸流程[/color][/size]
[size=medium][list]

[*] 登陸頁面,找到登陸頁面中關於驗證這塊的js代碼,並保存放到java可以訪問的地方
[*] 訪問登陸頁面,從頁面中分割出encyptKey
[*] 使用rhino訪問前面保存的js,使用encyptKey產生服務器需要的參數rpasswd
[*] 向服務器發送參數進行驗證
[/list][/size]
[size=medium]源碼參考附件,運行前加一下開心的賬號和密碼。[/size]


[size=large][color=blue]驗證碼問題 (補充)[/color][/size]
[size=medium]上一個帖子裏,很多人問到驗證碼問題,關於驗證碼,個人簡單看法如下:
[list]
[*]很多大網站爲了提高用戶體驗在用戶第一次登陸時不要求用戶輸入驗證碼。只有在用戶密碼輸入錯誤後,纔會要求輸入驗證碼。
[*]如果驗證碼是服務器端產生的,除了分析圖片,也沒有更好的方法,如果驗證碼是客戶端產生的,比如: 使用js產生的,可以使用rhino來模擬得到這個驗證碼。
[*]一般來說,登陸後,大部分網頁都可以訪問,大部分操作都可以模擬。但是有些操作,比如說發文章,通常要求輸入驗證碼,就比較難做到自動化。如果你發現哪個網站寫文章不要去輸入驗證碼,你就去寫個機器人去刷屏吧,就象javaeye的問答頻道一樣 :)
[/list][/size]

[size=medium][color=red]注: Foxswily提供了一個更好的工具HTMLUnit,直接模擬點擊網頁,我沒有實踐過,建議大家可以試一下。
http://www.iteye.com/topic/644353

有人提到Selenium,這個我以前沒有用過,看起來不錯,有空可以試一下。
[/color][/size]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章