图形验证码是一项非常重要的防攻击防护手段。从最初的数字到12306的各种女优,现在已经是至少第4代技术了。每一次升级换代,似乎都是道高一尺魔高一丈,没多久就会被机器识别技术给攻破。
第一代的图形验证码是简单图形验证,通过把数字/字母转化成图像,然后用户识别后还原为原始的数字/字母输入。系统通过比对用户的输入和原始数据,就可以返回是否通过验证的结果。由于简单地拼接固定的图形,所以是很容易进行机器识别的。
第二代的图形验证码原理和第一代相同,只是在生成图片的过程中,加入了变形和干扰。很可惜,这种变形和干扰对机器识别没多少效果(对于最顶尖的识别程序来说),但人反而很难正确识别。。。。。。。好吧,这种技术挡住了水平一般的识别程序,干掉了80%以上的企图钻空子的,成效卓著。但是,随着20%的有效程序的扩散,这种验证码也就形同虚设。真有人搞你,根本挡不住。于是,12306就搞了奇葩的各种女优的第三代验证码。
第三代技术和前两代完全不同,是通过解答问题来进行验证的。系统给出问题,用户输入问题的答案,系统对答案的比对进行验证。一开始似乎效果很好,完美解决了第二代技术的缺陷。但是,问题终究有限,所以答案也有限。很快,这种技术也沦陷了。
第四代技术就是12306所采用的技术,大家都知道,效果很不错,但问题和第二代技术一样,臣妾真的不认识哪个是女优啊。。。
还有一些其他独辟蹊径的技术,譬如滑动验证等等。
什么样的图形验证码才是好的验证码?
1、人容易识别和输入
2、机器不能识别
做到这两点,就是完美的验证码。
好吧,废话了很多,现在开始说方案。
我的方案是拼图验证,效果如下图:
上面是一个拼图,缺哪块是随机的。后台同时给出一个3x3的拼图(一个缺了一块的背景图片)和9块碎片,碎片的顺序是打乱的。用户需要在下面选上面缺少的那块碎片,并拖到上面完成拼图。这样,机器是很难知道那块碎片对应上面缺少的图形的。提升机器识别难度的偷鸡的做法就是让碎片颜色和原图有差异,边上再来一圈留白,这样机器基本上无法识别,而肉眼识别没什么问题。上图的例子里面,缺少的那块需要滑动碎片带才能出来,大家不要吐槽,呵呵。
问题似乎完美解决!但是,我们要当心别人需要的信息不要被自己泄漏出去。机器识别那个碎片配空白很难,但是知道空白在什么位置很容易。如果我们的碎片是按顺序来的话,呵呵,不费吹灰之力就能拿到数据对不对。所以,我们要把碎片打乱次序。好吧,就9个碎片,那我多猜几次,总能猜到吧,了不起9次循环。所以我们只能让人猜一次,无论验证有没有通过,这个ID的验证数据作废。每次验证,都给一个新的拼图。好吧,你拼图数量总不能无限多吧,我把所有的可能都存起来,然后我就可以猜测该用什么图尝试,平均1/9的成功率也还好啦。呵呵,图样图森破!同样的碎片,每次ID都不一样!你根本就猜不着呀猜不着!!!没错,真正的验证码就是碎片的ID,是个GUID哦。
咦?似乎猜中的几率还是1/9。。。。。。哈哈哈,没错,你只能猜,如果我把缺少的碎片改成1-2块的话。。。。哼哼,再不行就搞5x5的图,缺少1-4块碎片,这个几率是多少,哪位数学学得好给算算。