问题描述
首先使用HttpAnalyzerStdV7对浏览器登录某网站的请求以及返回进行了记录。而后使用c#httpRequest进行了模拟。监测结果两个完全一致,但是在最终登录的时候,c#却无法登录。cookie一直有保留,在最终登录时候的header监测中也能看到,连length都做到了一致。在我的感觉里面,我模拟的http与浏览器已经完全一样了。但是返回的数据不一样。大家有什么思路。
解决方案
解决方案二:
无法登录的返回值是什么
解决方案三:
HttpAnalyzerStdV7会自动解压返回的http包而你的程序不会自动解压请确定你的http收到的是否是压缩返回包,如果是,则需要解压。
解决方案四:
首先你能保证你的每个参数都是正确的吗?或者说你那个网站的请求参数没有其他什么多余的参数之类的比如腾讯的登录不仅有帐号密码的md5还有一大堆的各种id之类的参数甚至有个参数是你按键次数错一个都别想登录进去
解决方案五:
引用2楼knf的回复:
HttpAnalyzerStdV7会自动解压返回的http包而你的程序不会自动解压请确定你的http收到的是否是压缩返回包,如果是,则需要解压。
程序内已经做了解压了
解决方案六:
引用3楼crystal_lz的回复:
首先你能保证你的每个参数都是正确的吗?或者说你那个网站的请求参数没有其他什么多余的参数之类的比如腾讯的登录不仅有帐号密码的md5还有一大堆的各种id之类的参数甚至有个参数是你按键次数错一个都别想登录进去
通过对比抓包,参数格式是完全正确的,当然网站确实有randtr之类的随机字符,但是也全部进行了解析并提交。但是依然无法正确的返回结果。不过你的意思是还是从http请求的完全一直性上来做吗?
解决方案七:
引用1楼xdashewan的回复:
无法登录的返回值是什么
返回回的content,还是登录页面。正确的登录是个302跳转。跳转的连接中含有tikect(令牌的意思,拼写可能不对)
解决方案八:
引用5楼lz562065806的回复:
Quote: 引用3楼crystal_lz的回复:
首先你能保证你的每个参数都是正确的吗?或者说你那个网站的请求参数没有其他什么多余的参数之类的比如腾讯的登录不仅有帐号密码的md5还有一大堆的各种id之类的参数甚至有个参数是你按键次数错一个都别想登录进去通过对比抓包,参数格式是完全正确的,当然网站确实有randtr之类的随机字符,但是也全部进行了解析并提交。但是依然无法正确的返回结果。不过你的意思是还是从http请求的完全一直性上来做吗?
那么还有你前抓到的包是否够全?比如依然用腾讯举例腾讯登陆不止一个包的在登陆前会把q先发一个包过去来决定登陆是否需要用到验证码之类的如果不需要验证码则直接返回一个明文的验证码给你结合第二次发包作为真正登陆的包的其中一个参数我一般用浏览器自带F12抓包一般都是先打开目标登陆页面等登陆页面完全加载出来清空一次抓包去掉那些多余数据包然后手动输入帐号密码之类的登陆这个过程中产生的所有数据包而不是在点击登陆的时候再去抓包有些站你在文本框输入过程中可能也会产生数据包如果真的像你说的那样数据完全一直都没有登陆成功那就只有现场分析才可能知道了或者你的http头是否符合他站点要求或者干脆直接一点抓一个包的数据出来用你的程序用抓出来的cookie发送一个一模一样的数据包过去看看效果当然前提是他的每一个登陆会话都是同样数据才行不像腾讯那样先要去获取一个验证码作为第二次提交包动作无法回放
解决方案九:
如果你确认你的HTTP头和body真的完全和你浏览器的一致,那么你可能需要考虑登录可能不只有那个数据包那么简单。举个简单点的例子,你访问他的登录页面时,服务器产生一个动态的校验码之类的数据发给浏览器,并在登录时会附带上这串校验码给服务器验证。你现在的模拟提交的确完美模拟了登录时所有请求数据,但因为校验码是在你访问登录页面时动态产生,使得你提交的校验码并非是合理的,所以校验不通过。这当然只是举个例子,并非一定就是如此。我想说的是如果你确认单步登录数据完全正确,还无法顺利登录,那么你得考虑下多步,或者和楼上说的一样多包登录
解决方案十:
引用7楼crystal_lz的回复:
Quote: 引用5楼lz562065806的回复:
Quote: 引用3楼crystal_lz的回复:
首先你能保证你的每个参数都是正确的吗?或者说你那个网站的请求参数没有其他什么多余的参数之类的比如腾讯的登录不仅有帐号密码的md5还有一大堆的各种id之类的参数甚至有个参数是你按键次数错一个都别想登录进去通过对比抓包,参数格式是完全正确的,当然网站确实有randtr之类的随机字符,但是也全部进行了解析并提交。但是依然无法正确的返回结果。不过你的意思是还是从http请求的完全一直性上来做吗?
那么还有你前抓到的包是否够全?比如依然用腾讯举例腾讯登陆不止一个包的在登陆前会把q先发一个包过去来决定登陆是否需要用到验证码之类的如果不需要验证码则直接返回一个明文的验证码给你结合第二次发包作为真正登陆的包的其中一个参数我一般用浏览器自带F12抓包一般都是先打开目标登陆页面等登陆页面完全加载出来清空一次抓包去掉那些多余数据包然后手动输入帐号密码之类的登陆这个过程中产生的所有数据包而不是在点击登陆的时候再去抓包有些站你在文本框输入过程中可能也会产生数据包如果真的像你说的那样数据完全一直都没有登陆成功那就只有现场分析才可能知道了或者你的http头是否符合他站点要求或者干脆直接一点抓一个包的数据出来用你的程序用抓出来的cookie发送一个一模一样的数据包过去看看效果当然前提是他的每一个登陆会话都是同样数据才行不像腾讯那样先要去获取一个验证码作为第二次提交包动作无法回放
首先感谢你的回答。我的抓包过程刚开始也使用浏览器,也是像你这样进行抓包的(或者说后来变成这个样子,因为慢慢要把所有的参数摸全),后来利用浏览器已经完全一致依然不行,就换HttpAnalyzerStdV7(简称analyzer),用analyzer监控火狐浏览器,记录所有的请求以及返回。而后用自己的c#程序进行模拟。分三步1.获取页面,得到隐藏域的数值以及一个动态的action地址。2,获取验证码,构建一个图片的http请求,而后输出到我的form中。3.输入账号密码验证码,进行提交(当然也提交了前面所获得隐藏域name和value,以及提交的action也是页面动态提取过来的)。不同的就发生在第三步,如前文所说,浏览器提交之后是个302跳转,但是我的提交之后是一个正常的返回页面。返回页就是登录页。另外尝试使用抓包后的cookie值(网页登录后的),直接在程序中addCookie,然后带着这个cookie,做了一个get请求,返回的页面依旧是没有登录的页面
解决方案十一:
引用8楼xdashewan的回复:
如果你确认你的HTTP头和body真的完全和你浏览器的一致,那么你可能需要考虑登录可能不只有那个数据包那么简单。举个简单点的例子,你访问他的登录页面时,服务器产生一个动态的校验码之类的数据发给浏览器,并在登录时会附带上这串校验码给服务器验证。你现在的模拟提交的确完美模拟了登录时所有请求数据,但因为校验码是在你访问登录页面时动态产生,使得你提交的校验码并非是合理的,所以校验不通过。这当然只是举个例子,并非一定就是如此。我想说的是如果你确认单步登录数据完全正确,还无法顺利登录,那么你得考虑下多步,或者和楼上说的一样多包登录
首先感谢你的回答。确实有好多随机串,但是我用正则全部匹配出来了。并且我查看为了页面的js,在输入过程中这些串是么有变化的。另外啥叫多包登录?
解决方案十二:
引用10楼lz562065806的回复:
确实有好多随机串,但是我用正则全部匹配出来了。并且我查看为了页面的js,在输入过程中这些串是么有变化的。另外啥叫多包登录?
浏览器提交之后是个302跳转,你提交的拿到的是200吗?登录的地址是https?需不要证书?登录页除了获取图片之类还有没有其他请求?
解决方案十三:
引用11楼xdashewan的回复:
Quote: 引用10楼lz562065806的回复:
确实有好多随机串,但是我用正则全部匹配出来了。并且我查看为了页面的js,在输入过程中这些串是么有变化的。另外啥叫多包登录?浏览器提交之后是个302跳转,你提交的拿到的是200吗?登录的地址是https?需不要证书?登录页除了获取图片之类还有没有其他请求?
登录地址不是https,我提交之后拿到的是200