关于后台登录界面加入验证码的一些个人理解

最近在实验室做的项目中,有一个需求,由于普通的网站后台界面,没有验证码,用户输入帐户名和密码,网站系统直接将请求与数据库相关信息进行比对,甚至没有设置最短请求间隔和最多请求次数。

那么会发生什么的,很明显,穷举攻击,也就是攻击者通过字典,无限次尝试所有可能,直到最终试出用户名和密码,从而实现对后台的入侵。

由于笔者对于后台架构的了解也不是很深入,只有短暂的作为用户的了解,现在的主流防御措施有,第一个,加验证码,用户输入不正确,即使是正确的账号密码也不允许登录,第二个,设置单IP的最多尝试次数,一个IP只允许你尝试特定次数,就像银行ATM机一样,尝试次数过多,判定为恶意尝试,直接拒绝。第三个,我能想到的,设置最短请求次数。因为穷举攻击有一个特性,就是需要很长的时间通过字典进行尝试,而攻击者通常为了效率,设置的尝试间隔都会很短,这样的话,很容易区分出正常请求用户与恶意攻击者,因为正常请求用户很难在单位时间进行如此多的尝试。

在这些措施中,第二个与第三个我并不是很了解,因为笔者还属于技术层面比较低级的阶段,网页编程中涉及IP和请求等方面的原理还是不太了解。对于第一个也只是停留在浅层次,为了项目需求,在网上查到了一些资料,记录在这里,希望能对读者有帮助。

基本原理是,由于Session的存在,我们将生成的验证字符和验证图片都存入session,然后读取用户输入的字符,进行比对,如果正确,则进行下一步的账号密码比对,如果错误,则直接弹出错误信息,强制用户重新输入。

这样就能在网站进行数据库操作之前,先验证用户是否为合法,从而实现对穷举攻击的有效防御。当前大多数网站系统都会有验证码系统,有的更高级一些,通过拖动滑块到指定位置,还有比如12306的点击物体的方式,其实本质上都是为了验证用户请求的合法性,这样一想,对于12306的近乎严厉的验证方式是不是也有些宽容了呢。

附上一些核心代码的图,当然笔者对于PHP语言的了解也不是很深刻,只能通过注释略微读懂代码的原理和应用方式,希望能有一些参考价值吧,代码非原创,请勿作为商业用途。

可以看到主函数的大致内容就是生成四个随机数字,并将随机数字画成图片供用户来识别,画图的方法用的ymagestring()方法,各个参数也都很好的解释了,这样一看应该不难理解。

下面是验证模块。

可以看到,用的是嵌套架构,先验证验证码机制,然后打开session,如果验证码正确,通过SQL查询用户名和密码是否正确,如果正确跳转管理界面,并设置session名为登录名,如果错误,提示错误用户名或密码,当然最后是如果验证码错误,提示Wrong Verification code。很真实。

这个便是简单的验证机制了,当然还有第二种基于IP的和第三种基于请求间隔的,由于项目没有要求,笔者没有过多的探求了。写在这里权当学习笔记,如果能给各位一些参考更好了。

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180425G15UJW00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券