C#類比網站使用者登入

來源:互聯網
上載者:User

標籤:

我們在寫灌水機器人、抓資源機器人和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中輸入http://zh.sdo.com/web1.0/home/fastlogin.asp 這個快速登入地址,我們將看到已經抓到了很多請求和響應的包。

3.輸入使用者名稱和密碼,點擊登入,IE中正常登入,停止抓包,我們要的所有資訊都被抓取好了。

4.盛大的登入機制還是屬於比較複雜的,中間涉及到好幾個伺服器,經過分析得知(這個就是一個比較漫長的過程了,具體網站具體分析,這個分析過程我就不寫了)縱橫天下的登入機製為:

1)IE請求https://cas.sdo.com:80/cas/login?service=http://zh.sdo.com/web1.0/home/index.asp頁面,該頁面給IE一個SessionID,比如Set-Cookie: ASP.NET_SessionId=avcbse55l5e03suqi4dx3555; path=/

2)IE同時在該HTTP的本文中得到一個ticket,這個ticket將在登入中有用,當然其他網站肯定不是這樣做的,這裡分析的是縱橫天下的。location.href    =    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; 這裡lt參數就是我說的ticket了。

3)將獲得的lt、使用者名稱、密碼還有一些其他的無關緊要的參數都Post到https://cas.sdo.com:80/cas/Login.PostTarget.aspx?service=http://zh.sdo.com/web1.0/home/fastlogin_after.asp 中,具體抓到的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& amp;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在附件中,大家有興趣研究的可以看一下。 LoginSdoDemo.rar

代碼中實現了盛大帳號的登入,其實縱橫天下的登入還沒有完成,接下來還有選擇具體伺服器,將ticket轉到具體伺服器上再進行驗證,原理也是一樣的,我這裡就不再累述了。

成功登入後,接下來我們只需要每次發送請求是跟上該Cookie,伺服器就認為是登入的使用者在操作了,接下來就可以隨便灌水、Download資源了,具體要做什麼就大家自己弄了,只需要在IE中操作一篇,抓包分析出來,用C#實現同樣的發包就OK!

 

附:

 


1 private void Form1_Load(object sender, EventArgs e)
2 {
3
4 string username = "xxxx";//使用者名稱
5 string password = "xxxx";//密碼
6 //建立一個用於儲存cookies的容器 
7 CookieContainer container = new CookieContainer();
8 //拼接post資料
9 string postData = ("username=" + username);
10 postData += ("&passwd=" + password);
11 postData += ("&login=%B5%C7%A1%A1%C2%BC");
12 ASCIIEncoding encoding = new ASCIIEncoding();
13 byte[] data = encoding.GetBytes(postData);
14 HttpWebRequest request =(HttpWebRequest)WebRequest.Create("http://xxxx/xxxx/login.asp");
15 request.Method = "Post";
16 request.ContentType = "application/x-www-form-urlencoded";
17 request.ContentLength = data.Length;
18 request.KeepAlive = true;
19 request.CookieContainer = container; //返回的cookie會附加在這個容器裡面
20 //發送資料
21 Stream newStream = request.GetRequestStream();
22 newStream.Write(data, 0, data.Length);
23 newStream.Close();
24 //以下倆句不可缺少
25 HttpWebResponse response =(HttpWebResponse)request.GetResponse();
26 response.Cookies = container.GetCookies(request.RequestUri);
27
28 HttpWebRequest requestScore =(HttpWebRequest)WebRequest.Create("http://xxxx/xxxx/Score.asp");
29 postData ="term=&TermList=%C7%EB%D1%A1%D4%F1&ckind=&lwPageSize=100&lwBtnquery=%B2%E9%D1%AF";
30 data = encoding.GetBytes(postData);
31 requestScore.Method = "Post";
32 requestScore.ContentType = "application/x-www-form-urlencoded";
33 requestScore.ContentLength = data.Length;
34 requestScore.KeepAlive = true;
35
36 //使用登陸的cookies通過接下來的驗證
37 requestScore.CookieContainer = container;
38 Stream stream = requestScore.GetRequestStream();
39 stream.Write(data, 0, data.Length);
40 stream.Close();
41 HttpWebResponse responseSorce =(HttpWebResponse)requestScore.GetResponse();
42 StreamReader reader = newStreamReader(responseSorce.GetResponseStream(), Encoding.Default);
43 string content = reader.ReadToEnd();
44 textBox1.Text = content;
45
46 }

C#類比網站使用者登入

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.