很早以前我就思考一个问题:验证码在理论上是否有存在的必要性呢?
从验证码第一次被应用于网络中,早期的验证码是一串非常简单的形状标准的数字,经过长期的发展,形式越来越多样化,人们似乎已经习惯了,没有人去质疑它有什么问题,更没有人去思考它是否有存在的必要。复杂的验证码虽然起到了防范非人为操作的作用,但是带来的时间及效率上的损失更是巨大的。的确,它不是一个错误,但是我们从效率上来考量,它就是一个累赘。我们有必要让人们从繁琐的辨认、输入、输错重输的严重耗费时间的劳动中解放出来。
人为操作与机器操作(非人为操作)的区别也许有点隐晦,但是否不可能区别呢?我们可以设想一下,在一栋高科技大楼中你需要通过一道电子门,而这个门有一个识别程序,当通过者判定为人类才可以打开,如果是机器人那么就不开门。而你作为一个活生生的人类站在这道门前,却需要回答一个可笑的问题:"请问8+2=?" ,当你准备输入了10的时候,却按错了一个按键,门锁住了。这时候来了一个机器人,它同样准确无误地输入了10,这时候门打开了。这是不是一个看起来一个很愚蠢的电子门呢?我想大部分人在此都会自然而然的发出质疑:难道区分人类和机器就一定要用这种看似可笑的问题吗?为什么不从人类与机器的本质不同上加以区别呢,比如人类的生命体征、人体的热辐射等等...
其实现在的验证码就在做和这道电子门同样的事——在铁路订票的网站上煞费苦心弄出来一套奇形怪状的验证码,人眼都难以识别,机器是否不能识别还存疑。在一个偶然的机会之前,我曾一直困惑在机器与人为操作的结果都是对服务器发送请求,而如果在结果这一步,人为操作的痕迹已经完全没有了,换句话说,发送网络请求的时候是无法验证请求操作是来自人还是机器。那么我们考虑网页上当一个人类用户去输入文字的时候,有这样一个过程:光标从别处移入到可输入框内,光标变成一个"I形"的可输入符,点击鼠标左键,光标再次变成闪烁的输入提示符,重复(按下键盘按键,按键抬起),完成输入。这个过程是机器不会去做的,所有的自动登录的软件都是直接发送请求到服务器,机器并不需要去模拟鼠标移入这个动作,因为没有任何意义(至少在本文发出去前是这样)。而这个人为动作我们就可以拿来用于识别是人还是机器。我们在页面的脚本代码中加以验证鼠标是否在移入了指定的输入框时状态发生了改变?如果鼠标变成了输入符,则继续验证:是否在这之后点击量鼠标左键,如果有,则进入输入状态,继续验证:在输入状态下是否有按键按下和抬起?在按键按下和抬起中可以记录按下了哪一个键,然后在按键抬起的时候与真实输入框内的字符进行比较是否一致(好在现在的密码是没有中文字符的),如果一致则认为是一个人工的输入,之后在最后点击按钮的时候可以再次进行综合验证。思路就是这样,当然聪明的程序员可以把这个验证过程加以完善,我相信可以做到不需要验证码一样可以完全识别出有效的人为操作。我之后有空会给出一个实例。