使用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!
 

0javascript

收藏java

fangdaren

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

Ctrl+Enter 發佈web

發佈編程

取消瀏覽器

相關文章
相關標籤/搜索