在访问一些网页的时候,需要输入一个验证码,目的是防止恶意访问
原理大致如下
访问某网页时,如http://jwgl.sias.edu.cn/Default2.aspx,
验证码是一张图片被嵌在登陆信息表格内 他的src属性为 src="CheckCode.aspx"
而当用户访问时,img标签在加载时则自动访问这个 aspx 动态页面 将返回的 png或jpg 图片格式加载出来
随后用户输入验证码,首先验证验证码,成功则再验证用户名与密码,否则则直接提示验证码错误
那么验证码的隐藏工作原理又是什么呢?
众所周知,如果验证码服务页面只是当你每次访问时,返回一张图片,并记录下这张图片对应的验证码,如何起到区别用户的作用?
所以,验证码服务器 如上方的 CheckCode.aspx 内部一定有一个唯一的参数,用来区分不同用户
猜想格式如下
var userID;//存放用户唯一ID
var checkCode;//存放正确的验证码
var returnIMG;//返回验证码对应的图片
而 userID是区分每组的关键
我们试试直接访问 http://jwgl.sias.edu.cn/CheckCode.aspx
依然直接出现了验证码图片,而且最重要的是,如果你已经打开了登陆页面,我们再用新的窗口去打开这个页面
随后在老窗口输入这个新的验证码,验证通过!
而我们看看我们在访问这个新的页面的时候,是否传了什么数据过去
我们看到是已 get 方式 进行访问,而且没有任何参数,所以唯一能区分用户的,就是这个 SessionID
到此为止,我们已经有了在其他设备上获取验证码的方法了
1.首先Android 线程发起访问,访问主页面(此时页面已经自动访问了验证码服务器而我现在无法保存返回的图片)
2.保存Cookie
3.重新对验证码服务页面单独访问,将Cookie放在Header中(此时验证码服务器会更新你的当前验证码,抛弃旧的,采用新的)
4.返回新的图片
5.在手机上输入密码以及新的图片对应的验证码,依旧将sessionID放入Header中并以post形式直接访问form的action目标地址
6.完成登录
Done!
Additions:
查阅了有大神的相关方法,应该更方便的可以实现
大家可以参考