我见过的验证码中,百度的算是相当高明的了。没想到竟然会有人破解(比如93,和以前蒂兰圣雪的作者)。
因此我考虑了一种更搞的验证码。当然,这不是给所有的网站都能用的。而且我这也不是非常新奇。
现在的应用,在我的实验基地NeoAtlantis上(
注册后需要激活才能发帖,这时就看到了。注册时的验证码不是我说的!网址
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/neoatlantis)。
很简单,验证码就是一些高中甚至大学的题目。不是所有人都能做上来,但是用来识别的程序目前看是一定做不上来。
为了避免通过记录图片地址获取答案的顺藤摸瓜,验证码需要如此工作:
首先,数据库内有两个表A、B。A表记录:ID,图片名称,图片对应的答案;B表记录MaskCode、ID。每次调用验证码,先在A表中任意选取一条记录,取出其中的图片名称(文件名)。利用程序将系统中对应的文件改成另一个随机的名字XX。然后,将这条记录中的图片名称更新,并在B表中加入新的记录,其中的MaskCode就是这个新的随机名字XX,ID为A表中所选记录的ID。
接着,根据XX,将图片显示给用户,一并传递给浏览器XX。用户做题,得到答案,提交给服务器数据后,服务器在B表中根据MaskCode=XX找到ID,并从A表中找到答案。于是比对,就做出判断。最后,删除B表中的这条记录(释放空间,注意到不见得所有的用户都会回答,为了避免恶意请求让数据库爆满,还需要删除过期的记录,这需要另一个字段)。
由于一切都在幕后操作,用户无法得知图片名和答案的对应关系。只要图片足够多(或者以题目颜色加入干扰物),用户也难以用识别图片特征的方法得知图片特征和答案的对应关系。试图分离图片中的干扰物,不能避免题目中的一些图像也被删除。
200字以内,仅用于支线交流,主线讨论请采用回复功能。