验证码作为防止表单垃圾信息普遍采用的方法,一直被广泛使用。但是同时它造成了很不好的用户体验,为合法用户的正常操作带来不便。本文介绍了一种抛弃使用验证码的方法,来防止自动程序进行垃圾信息的提交。
以前见过类似的方法,这几天在中文版的《15天学会jQuery》上看到了原作者有关的链接(http://15daysofjquery.com/examples/contact-forms/),简单试验了一下效果不错。首先说明一下整体流程,主要对原文总述部分进行了简单翻译:
1、当表单被载入后,我们创建一个到PHP文件的AJAX调用;
2、该PHP文件将取得当前时间(依靠服务器,并不是访问者的浏览器);
3、该PHP文件将结合时间戳,加上一个加密的字(用户自定义的一个字符串——译者注),产生一个32位的“哈希”并把它作为cookie存储到访问者的浏览器上;
4、jQuery将接收这个从AJAX调用来的时间戳信息,并将该哈希值或“令牌”作为表单的隐藏标签而存储;
5、当该表单为处理而被发送,这个时间戳的值(表单中的——译者注)将和存储在cookie中的32位字符“令牌”做比较;
6、如果信息不匹配,或是丢失,又或者时间戳过期,我们将终止表单处理的执行,同时这个垃圾邮件发送者将会把目标转移到另一个简单的猎物上(放弃我们这个目标——译者注)。
通过上面的介绍,相信大家已经基本明白了吧。核心部分就是在页面被载入时,采用AJAX动态创建一个特定的隐藏表单元素,该元素只有在真正用户访问时才会存在,对于自动化的“机器人”来说是不存在的。好了,下面我们来动手做个简单的例子实践一下:
这里需要3个文件:前端提交表单的页面test.html,提交后的后端处理页面test.php,以及用户产生“令牌”的AJAX页面do.php。(没错,前两个页面也可合并为一个)
首先当然是创建表单了: