作者:手机用户2502870493 | 来源:互联网 | 2023-09-07 15:55
我们的系统使用截图方式获取验证码一直不靠谱,偶尔会报错。为了彻底解决这个问题,想着可以使用发送请求方式直接获取验证码。但是,又出现了新问题,对方服务器一直返回“验证码失效的错误”,弄了
我们的系统使用截图方式获取验证码一直不靠谱,偶尔会报错。为了彻底解决这个问题,想着可以使用发送请求方式直接获取验证码。但是,又出现了新问题,对方服务器一直返回“验证码失效的错误”,弄了很久,最后发现,问题出在COOKIE的处理上。
获取验证码请求会设置COOKIE。正常登陆过程,比如登陆页面的webBrowser初始COOKIE=ck_1,当发送验证码后,webBrowser页面COOKIE=ck_2。因为我们登录使用webBrowser模拟的方式,而获取验证码使用的http直接请求的方式,所以,发送验证码请求获取验证码图片,我们还需要将当前http返回的COOKIE写到webBrowser的对应COOKIE里。可以使用JS的方式:
"document.COOKIE= c.Name=escape(c.value)"
但是,这样就可以了吗?webBrowser是根据COOKIE的路径取相应的COOKIE再发送到服务器进行认证的,但是,上面并没有设置COOKIE路径,而默认路径是在当前目录下,并不一定是根目录。所以,还需要设置COOKIE路径:
"document.COOKIE= c.Name=escape(c.value);path=c.path"
只有COOKIE的name,path,domain这三个属性都相同,才会被覆盖。取COOKIE的时候会先尾匹配domian,然后前匹配path。所以,domin或path详细,当名称相同的时候会被优先使用。例如:
COOKIE_1:"document.COOKIE= name=sb1;path=/domain=csdn.net"
COOKIE_2:"document.COOKIE= name=sb1;path=/tt;domain=csdn.net"
同时存在的时候,会使用COOKIE_2的值。
可以通过设置COOKIE有效期,Expire time/Max-age属性,来删除对应的COOKIE.
使用fiddler分析http请求的时候,有的COOKIE后面有HTTP-Only标志,这是为了防止窃取COOKIE的安全机制,设置HTTP-Only后,使用JS不能访问该COOKIE。
一旦COOKIEs通过Javascript设置后遍不能提取它的选项,所以你将不会知道domain,path,expiration日期或secure标记。因此分析request的COOKIE的时候,我们只能看到COOKIE的name和value.
参考资料:
- http://www.dannysite.com/blog/77/
- http://blog.csdn.net/fangaoxin/article/details/6952954