使用C#實現網站用戶登錄

【出自博客園深藍居
         我們在寫灌水機器人、抓資源機器人和Web網遊輔助工具的時候第一步要實現的就是用戶登錄。那麼怎麼用C#來模擬一個用戶的登錄拉?要實現用戶的登錄,那麼首先就必須要了解一般網站中是怎麼判斷用戶是否登錄的。
HTTP協議是一個無連接的協議,也就是說這次對話的內容和狀態與上次的無關,爲了實現和用戶的持久交互,網站與瀏覽器之前在剛建立會話時將在服務器內存中建立一個Session,該Session標識了該用戶(瀏覽器),每一個Session都有一個唯一的ID,第一次建立會話時服務器將生成的這個ID傳給瀏覽器,瀏覽器在接下來的瀏覽中每一個發向服務器的請求中都將包含該SessionID,從而標識了自己的身份。
服務器上是使用內存來保存Session中的信息,那麼瀏覽器又使用什麼來保存服務器分配的這個SessionID了?對,是Cookie。在剛建立會話時瀏覽器向服務器的請求中將不包含SessionID在Cookie中,服務器就認爲是一個全新的會話,從而在服務器上分配一段內存給該Session用,同時將該Session的ID在Http Header中使用Set-Cookie發送給瀏覽器。
現在原理已經搞清楚了,那麼我們就來實現一個網站的登錄嘛,這裏就以盛大縱橫天下的登錄爲例。
要寫這種面向協議的網絡程序,抓包工具是少不了的,我們首先是要使用抓包工具分析在普通瀏覽器中登錄時發送和接收的內容纔好進一步使用C#來模擬瀏覽器發包。抓包工具很多,看個人愛好吧,我主要用的是HTTP Analyzer,專門針對HTTP的,太強的抓包工具把什麼協議的包都抓出來反而不利於我們分析。
1.最好能清除IE的所有Cookie記錄,以免對抓包分析造成影響,然後開啓抓包程序。
2.在IE中輸入[url]http://zh.sdo.com/web1.0/home/fastlogin.asp[/url] 這個快速登錄地址,我們將看到已經抓到了很多請求和響應的包。
3.輸入用戶名和密碼,點擊登錄,IE中正常登錄,停止抓包,我們要的所有信息都被抓取好了。如圖:
 
4.盛大的登錄機制還是屬於比較複雜的,中間涉及到好幾個服務器,經過分析得知(這個就是一個比較漫長的過程了,具體網站具體分析,這個分析過程我就不寫了)縱橫天下的登錄機制爲:
1)IE請求[url]https://cas.sdo.com:80/cas/login?service=http://zh.sdo.com/web1.0/home/index.asp[/url]頁面,該頁面給IE一個SessionID,比如Set-Cookie: ASP.NET_SessionId=avcbse55l5e03suqi4dx3555; path=/
2)IE同時在該HTTP的正文中得到一個ticket,這個ticket將在登錄中有用,當然其他網站肯定不是這樣做的,這裏分析的是縱橫天下的。location.href    =    [url]http://www.sdo.com/login2.asp?lt=sd-1420e593-d2cf-4c9c-b249-07fe27932a21-2008-05-06_01%3a25%3a41.484&service=http%3a%2f%2fzh.sdo.com%2fweb1.0%2fhome%2ffastlogin.asp%3ftest%3d1[/url]; 這裏lt參數就是我說的ticket了。
3)將獲得的lt、用戶名、密碼還有一些其他的無關緊要的參數都Post到[url]https://cas.sdo.com:80/cas/Login.PostTarget.aspx?service=http://zh.sdo.com/web1.0/home/fastlogin_after.asp[/url] 中,具體抓到的Post的數據如:warn=false&_eventId=submit&idtype=0&gamearea=0&gametype=0&challenge=3623&lt=sd-1420e593-d2cf-4c9c-b249-07fe27932a21-2008-05-06_01%3A25%3A41.484&username=studyzy&password=1234&ekey=&challenge=3623,這裏我們就只關心lt,username,password這三個參數。
4)獲取一個只有登錄後才能訪問的頁面,測試是否登錄成功。
5.好,整個登錄機制我們已經分析完了,接下來就是考慮代碼的實現了。在面向HTTP協議上,C#中有WebRequest、WebResponse、HttpWebRequest和HttpWebResponse等類。我們主要就基於這些類進行操作,當然完全基於Socket編程也可以,但是這裏就沒有這個必要了。
在不設置Cookie、PostData的情況下要獲得一個頁面的HTML的方法很簡單:
public static string GetHtml(string URL)
                {
                        WebRequest wrt;
                        wrt = WebRequest.Create(URL);
                        wrt.Credentials = CredentialCache.DefaultCredentials;
                        WebResponse wrp;
                        wrp = wrt.GetResponse();
                        return new StreamReader(wrp.GetResponseStream(), Encoding.Default).ReadToEnd();
                }
當需要獲得服務器返回的Cookie的話,可以通過wrp.Headers.Get("Set-Cookie")方法來獲取。
如果需要將Cookie加入到請求另外還Post數據的話其實也很簡單,只需要將httpWebRequest對象中設置ContentLength 和Request的Stream就可以了。
httpWebRequest.ContentLength = byteRequest.Length;
Stream stream;
stream = httpWebRequest.GetRequestStream();
stream.Write(byteRequest, 0, byteRequest.Length);
stream.Close();
代碼我就不都貼出了,我做了一個Demo在附件中,大家有興趣研究的可以看一下。 [url]http://fangdaren.blog.51cto.com/p_w_upload/200811/452311_1227166358.rar[/url]
代碼中實現了盛大賬號的登錄,其實縱橫天下的登錄還沒有完成,接下來還有選擇具體服務器,將ticket轉到具體服務器上再進行驗證,原理也是一樣的,我這裏就不再累述了。
成功登錄後,接下來我們只需要每次發送請求是跟上該Cookie,服務器就認爲是登錄的用戶在操作了,接下來就可以隨便灌水、Download資源了,具體要做什麼就大家自己弄了,只需要在IE中操作一篇,抓包分析出來,用C#實現同樣的發包就OK!
 

0

收藏

fangdaren

15篇文章,3W+人氣,0粉絲

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章