我们在创建web页面登录(注意是“登录”,而不是“登陆”,现在很多大企业甚至银行的系统都用错这两个字,让我们情何以堪呢^_^)的系统时候,往往会需要用户填写三个文本框:
用户名文本框,登录密码文本框,验证码文本框。那么为什么我们要使用验证码呢?这源于系统安全的一种考虑。
试想一下,如果不使用验证码,那么我们正常情况下只要输入对用户名和登录密码就可以登录了,那么同样,有恶意意图的操作者,比如想要破解登录你邮箱的人就可以利用机器程序多次输入多个不同的用户名和密码来进行尝试登录,更有甚者,如果你的用户名被泄露了,而且你的密码设置的又十分简单(比如五位数字),那么机器程序只要分析出来登录系统的验证接口地址就可以多次尝试,像这种五位数字的密码,一般估计几分钟之内就能被破解了吧。
那么有没有办法阻止这种尝试呢?答案是有。就是我们要说的验证码技术。
上面的推想过程中如果加入了验证码功能,那么就为机器程序破解带来了一定的难度,因为每次的验证码都不一样(当然要是用图片格式的验证码,如果是使用文本直接显示的验证码的话还不如没有)。这样每次机器程序尝试登录的时候都会因为猜测不到验证码而被阻止,因为验证码的理想状况是:验证码图片显示的内容只有人眼才能识别出来(有的设计的甚至还需要人眼识别之后进行一些转换),然后人工输入。
这样就起到了防止恶意破解登录的安全作用。
上面说的是比较理想的状态来实现防止机器人程序恶意“暴力破解”。
实际当中有很多情况会不是上面描述的“理想状态”,比如:
(1)程序员在写程序过程中只在每次生成验证码图片时在服务端记录一个会话session来保存验证码的值,但是没有在每次用户错误或正确登录后及时清除这个会话,那么机器人程序就可以每次提交尝试密码时使用第一次获得的的正确的验证码进行提交就可以多次进行尝试了,这样,验证码也就失去了作用;
(2)验证码图片上显示的内容(通常是数字)太过于中规中矩,非常规范,这就让某些机器程序又有了机会可乘,它们会通过扫描验证码图片的方式来识别出来图片上的内容,从而跳到上面的步骤中进行多次尝试登录的密码;
(3)验证码图片上显示的内容变形过于严重,严重到甚至人的肉眼也看不出来、识别不了,多次刷新之后还是输入错误,这样用户体验就不好了;
(4)本来登录一个系统越简单越好,结果不但要输入用户名、登录密码,现在还要再输入一个登录验证码,这对于有些不经常使用或者说不能熟练操作计算机的用户来说无疑也是个不便;
以上的这几种情况是设计验证码过程中容易出现的问题,需要我们好好的考虑一下如何进行最优化设计。
良好的验证码体系,应该既能给用户良好的使用体验,又能防止恶意登录尝试或暴力破解。
下一篇我们继续探讨。