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

发布编程

取消浏览器

相关文章
相关标签/搜索