分享

【转】inet自动登陆

 看见就非常 2012-07-22

本文面向有一定基础,并能够独自分析语法,对编写程序有兴趣的读者。文中所述的某些技术对其他论坛、邮箱、社区等均有效,而本文的重点则在于分析错误的能力。

来有些日子了,觉得是个学编程的好地方,但每次登陆总觉麻烦,因此有了编一个程序自动登陆论坛的想法。想法是好的,实现起来却走了不少弯路,因此,便有了写这篇文章的念头,将我在编写登陆程序的过程中曾经出现过的问题全部总结一下,我深信,这篇文章必定会为大家喜欢,也一定会有很多人收藏的!(因为在我有了想法之后,几乎还没在网上找到一篇有关这方面的详细资料,也许是我太菜了吧!)

在具体的代码开始之前,我想有必要先交代一下有关Cookie及Session的问题。

现在几乎安全性比较好的网站都使用了Cookie Or Session,前者是存放在本地电脑上的,能够保存登陆信息并在下次登陆时不必再次输入密码,可以说是根据服务器上的代码有目的性的产生;后者则在登陆及保持连接时有用,它的产生是随机的仅相当于一个临时ID的作用。简单来说,Cookie是长期存在的,相当于服务器在你的电脑上留下的一个记号;而Session则只在登陆时有用,并会在保持连接时不断发送,断开连接之后,Session就不存在了,它的主要作用在于服务器一方使用Session来区分各用户。

之所以只是简单的说明一下,是因为在我起初的代码总是不断失败的时候,我曾经误以为Inet或WebBrowser不能与服务器进行Cookie Or Session的对话,而事实上完全不是这样的,因此读者大可不必对Inet或WebBrowser疑虑重重了。相信这句话一定让某些读者大为放心,我自己便曾经翻山越岭去查找Cookie及Session的资料,甚至想到使用Winsock模拟发送了~。

**********************下面看看代码**********************

“部件”中勾中Inet控件,放一个Inet、一个按钮、两个文本框在窗体上,两个文本框的MultiLine属性设置为True。然后在代码窗口中添加上以下代码:

    Option Explicit

    Dim URL As String

    Dim Cookies As String

    Dim a As Integer

Private Sub Command1_Click()

    Dim stemp As String, pagecode As String

    Dim strURL As String, strFormData As String

    strURL = "http://www.csdn.net/member/logon.asp"

    strFormData = "login_name=账号&password=密码"

    Inet1.Execute strURL, "Post", strFormData

   

    Do Until Inet1.StillExecuting = False '这里阻塞前面的Inet1,你可以将此Do取消了试一次

        DoEvents

    Loop

    stemp = Inet1.GetChunk(1024)

    Do While stemp <> ""

        pagecode = pagecode + stemp

        stemp = Inet1.GetChunk(1024)

    Loop

    Text2 = pagecode

End Sub

Private Sub Inet1_StateChanged(ByVal State As Integer)

    Select Case State

        Case 12

                Text1.Text = Inet1.GetHeader

       Case Else

    End Select

End Sub

这便是我最初的代码,不要问我这些代码是从哪里来的,我所要说的一切便以这段代码为起点,因此我希望读者能够起码知道这段代码的基本意思(不要求全都读懂,没必要。)

Inet1_StateChanged用来得到服务器返回的文件头,请读者换上自己的账号及密码试运行一次,便会发现返回的文件头里既没有Cookie也没有Session的信息,而第二个文本框里面则返回的是“请输入用户名!”这样的信息,这说明我们的登陆失败了。

稍后我将说明这段代码中的两个致命的错误。

在此之前我首先解释一下“login_name=账号&password=密码”这两个参数以及"http://www.csdn.net/member/logon.asp"这个地址的由来。

"http://www.csdn.net/member/logon.asp"这个地址是怎么来的?为什么是“login_name”不是“name”,是“password”不是“pass”?既然返回的是“请输入用户名!”这样的信息,这便说明这我们的账号及密码服务器还都没来得及验证登陆便失败了,是这两个参数出了问题了吗?如何保证服务器能够认识这些参数而不是那些参数?

这便要求具有一定的分析HTML的能力,当然最好是自己写过网页并且了解服务器上网页的工作机制。可以告诉大家的是,这三个东西都是从CSDN的登陆页面的源文件中分析出来的。具体怎么分析的我就不多嘴了,倒是那些还不能独立分析HTML的读者,我在这里要向你们推荐一个很有用的工具“Visual Sniffer”,它可以拦截通过网络传输的TCP/IP/UDP/ICMP等数据包,利用这个工具你可以很轻松的得到这几个参数。

现在我们用IE打开“http://www.csdn.net/member/login.asp”CSDN的登陆页面,输入你的账号及密码,先不要点“登陆”,将Visual Sniffer运行起来,点一下“开始拦截”这个按钮,再回到登陆页面,点击“登陆”,稍等片刻,登陆成功之后在Visual Sniffer上点一下“停止拦截”,现在你就可以找一下刚才IE到底向外发送了些什么东西。(建议你在做这些之前将多余的IE全都关掉,因为倘若其它IE窗口也在发送数据,你将会在Visual Sniffer受到不必要的干扰。)

注意现在在Visual Sniffer的左边有很多“+”号,这些便是被拦截到的数据,将它们一一展开,此时应注意查看右边的数据,倘若第一行没有“POST”这样的字符,那便迅速换一个“+”号,这已经是最快的找到向CSDN的服务器发送数据的方法了(我们的登陆是“POST”请求,如果看到的“GET”,那肯定不是)。请看实际的图片:

绿线所画的内容合起来就是POST的地址。红线所画的便是POST出去的参数,所以我们前面那段代码里这两个参数是没有问题的。那么到底是什么地方出问题了呢?(顺便提一句,你看到的那个Cookie:ASPSESSION……长长的这段就是Session)

虽然还是一头雾水,但是比起刚开始的时候,我们已经拥有了一个很重要的工具——“Visual Sniffer”!

不错,或许已经有朋友想到了,我们的代码也是使用的HTTP协议,Visual Sniffer肯定也能拦截,只要再将代码拦截一次,便能比较两次POST的有什么不同的数据了。

果然,我们自己的代码发送出去的数据比起IE的登陆窗口少了许多内容。

现在先对发出去的文件头稍加说明一下:

“Accept:”表示能够收到的文件格式。

“Referer:”表示指向的文件地址。

“Accept_Language:”表示接受的语言。

“Host:”表示主机名。

有几个不是很重要,因此这里就不多说了。现在关键是比较这两个POST出去的数据包有何异同。请注意看紫色部分,这些是我们的代码没有发送出去的内容,而这两处也正好刺中我们代码中的错误!

“Content-Type: application/x-www-form-urlencoded”这是什么?赶快查资料!

回到代码中“Inet1.Execute”的地方,将后面的东西全擦掉,按一下空格,可以看到,“Execute”有四个参数,而我们只给出了三个,还有一个“InPutHeaders”参数没有指明。

而恰恰是这个参数告诉服务器数据的解码方式!!

明白了吧?我们不带这个参数服务器便无法知道“login_name=账号&password=密码”怎么解码,从而误以为用户没有输入用户名,那它当然只能返回一个“请输入用户名!”这样的信息了~

将代码替换成

Inet1.Execute strURL, "Post", strFormData, "Content-Type: application/x-www-form-urlencoded "

再试一次,返回的是什么?

“保存时间有误!”??????

我的第一反应是:“有门儿,离成功不远了!”,起码用户名及密码服务器都已经接受了~而且第一反应也告诉我,很可能是我少了一个参数!

现在我们再看一下图片中第二个紫色圈起来的地方,这个地方有“Cookie”的字眼,而且与账号密码连在一起,这说明,这个地方也是服务器必须接受的参数!那么是什么参数呢?

让我们再次打开http://www.csdn.net/member/logon.asp,相信CSDN的朋友们对下面的这副图片已经熟悉的不能再熟悉了吧~注意红色圈起来的地方~

原来还有一个参数,用来设置Cookie作用的时间!而这个参数我在分析源代码时没能分析出来~(主要是经验不够)

现在将strFormData = "login_name=账号&password=密码&cookietime=0&x=42&y=10"替换掉原来的内容,再试一次~

Text1里面有返回的Cookie,Text2显示正在登陆的页面源代码~

恭喜你~你登陆成功了~

小结:参数是最重要的,尤其对网络上的服务器发送请求时所传输的参数名都不可能一样,因此这一步便要求迅速而准确地获得参数名,幸而我们已经有了一个很好的工具,从而得得已绕开复杂的分析源代码的过程。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多