前段时间spam比较多,临时添加了问题验证码功能(bmp图形验证码的原理还没有去研究^_^)。
临时问题验证码有一点点效果。当时的实现方式最大的问题是问题的答案也在网页的源文件中,作为参数传递。
这两天仔细狠下心来对验证码这块做了修改。先后调试了两套方案,第一套以失败告终,第二套就是现在评论系统使用的验证码。
第一套:md5+cookie。
原理:先对临时产生的问题的答案进行md5加密,然后将md5值作为参数在网页中传递,再对用户输入的答案进行md5加密,最后比较两个md5值。
问题:这套方案最终没有成功。最直接的原因是找不到两套相同md5加密程序(asp服务器端的vbscript版本和本地客户端的JavaScript版本),自己不会写,在网上找了好多套,差不多都是一样的。后来换了个思路,只利用服务器端的md5程序。新问题就是,在不刷新网页的情况下,如何将客户端的用户的答案作为服务器端的md5程序的参数。服务器端的参数可以给客户端程序调用,但是反过来的调用好像行不通。不过后来又试了一种方法。将客户端的用户答案写入cookie,然后服务器端读取cookie作为md5程序的参数。新问题就是,用JavaScript脚本写入cookie必须要刷新网页,不刷新是写不进去的。只好作罢。
第二套:ajax。
原理:1、验证码文本框获得焦点时,在问题DIV为空的情况下初始化问题(即随机显示一个问题)。2、验证码文本框失去焦点时,在答案不为空的情况下进行验证。3、单击问题可以改变随机问题。4、一些小提示,以提高用户的体验。
Ajax实现这样的一个功能应该算是比较简单比较容易了。但因为自己是第一次写ajax,所以有点手忙脚乱,思路也不清楚,需要完善和优化的细节太多了。
PS:写完第一套,突然觉得有一个新问题,自己是在同一台机器上调试的,服务器和客户机是一个。asp读取cookie是在服务器上,JavaScript写入的是在客户端上。当服务器和客户机不是同一台机器的时候,那么这个第一套方案是不是就直接over了?哎,这就是在缺乏经验,没有良好思维习惯情况下的正常表现。