June 11, 2014 分类: PHP/MySQL     作者: hoverlees     留言: 发表

验证码的出现是为了防止电脑程序模拟人工操作,实现批量,快速的数据请求. 一般验证码按以下流程开发:
1. 表单页面请求验证码图片生成程序
2. 验证码生成程序随机生成一个验证码,保存到服务器session中,并将验证码按一定随机规则画到一张图片上,返回给页面
3. 如果用户看不清,请求换一张,跳到步骤1,如果用户看得清,输入验证码,提交表单,跳到步骤4
4. 表单处理程序判断用户输入的内容跟session中保存的验证码是否一致,如果一致,通过数据提交,如果不一致,回到步骤1,要求重新填写.

看似简单的几个步骤,实现时却要注意以下两个问题:
1.验证码自动识别问题
这个是最容易想到的问题,机器通过图像识别,仍然可以得到验证码内容.一般验证码识别通过将图片二值化,降噪后,再进行特征提取,根据特征来对应具体的字符,所以简单的验证码操作根本就难不到计算机,以至于现在好多的验证码加了很多扭曲和添加杂色杂线的工作,甚至用了汉字来增加难度.只有这样做才会有效果.
对于机器识别的防治,最好是走正统方式,建议不要自己随便想一种机制就拿来应用,有可能我们想到的办法别人一下子就找到了很简单的识别方式.记得以前我就遇到一个游戏的验证码,是点击图片中只出现过一次的物品的区域,其他物品都出现过多次,感觉好像很难破的样子,其实只要把图片中的颜色进行分组,出现次数最少的那一组所在的区域就是需要点击的区域…
防制机器识别,还有一种办法是多做几套识别码,关键时刻换着用.对于像12306这样的网站非常合适,比如一年内做个10套验证码,平时用第一套,春运的时候换着用其他9套,让刷票软件花好多心思做出来的识别程序最终毫无用处.

2.验证码刷新时间问题
这个是很容易忽视的问题,特别在做抢有限资源的功能的验证码时要注意.比如12306的抢票或淘宝的抢购功能的验证码.操作方式就是提前通过验证码的链接获得验证码图片,并把验证码准备好(例如打好后复制起来),当开抢时,不加载新的验证码图片,直接提交开抢之前准备好的验证码,如果程序没有注意到时间问题,就会认为该验证码有效,从而达到”快速输入验证码”的效果.
对于这种情况,生成验证码保存session的时候,可以多保存一个刷新时间,当用户提交验证时,判断如果这个验证码是在开抢之前生成的,则此次验证结果无效.

当然,验证码也有一种无法防止的问题,那就是人工打码.这个也是好多年前就在游戏行业出现的服务,软件通过将验证码传输到打码团队某个成员的电脑上,由打码人员输入验证码并回传,程序再自动将验证码输入,这种方式往住有一定的利益关系才能维持下来,所以开发人员也不用太过担心这个问题.

我来留个言

您的电子邮箱我一定会保密的哦!

昵称

邮箱

评论内容