当前位置: 首页 > 科技观察

几种常见的验证码漏洞

时间:2023-03-14 20:55:39 科技观察

将验证码存储在Cookies中一般而言,我们会将验证码的值存储在Session中,通过对比用户提交的验证码和Session中的验证码就可以知道输入是否正确.由于Session会占用服务器资源,所以想过能不能把验证码的值加密保存在cookie中。但事实证明,这只是一厢情愿。假设验证码的值为a,用sha1加密后得到的值为b=sha1(a),b存储在cookie中。用户提交的验证码的值为c,通过判断sha1(c)是否等于b,可以知道输入的验证码是否正确。但是,cookie由客户端控制。如果用户事先肉眼看到验证码的值为a,并且从cookie中知道此时加密的值为b,那么只需要在提交前将cookie的值改为b,且提交的验证码值为a,则始终可以通过验证。如果不做非空判断,这种情况可以直接用代码解释:if(Request["captcha"]==Session["captcha"]asstring){//验证通过,继续操作}假设用户已经绕过了系统提供的表单直接提交数据。此时验证码还没有生成,Session["captcha"]为空。当用户没有提交验证码时,Request["captcha"]也为空。所以,验证通过了。解决这个问题,其实就是加一个非空判断:if(!String.IsNullOrEmpty(Request["captcha"])&&Request["captcha"]==Session["captcha"]asstring){//验证通过,继续操作}未能及时销毁验证码验证码的使用必须遵循一个原则。经过比对,无论用户输入是否正确,都必须立即销毁验证码。如果不这样做,就会出现下面的情况:假设用户出错,没有重新生成验证码,那么他可以一直尝试,直到他做对为止。虽然机器对图片的一次性识别率比较低,但是如果你对同一张图片给它多次机会,它还是可以识别的。假设用户进入成功,验证码没有被破坏,就可以使用这个验证码通过验证,直到Session过期。