验证码的几个常见漏洞

安全 数据安全
一般来说,我们会把验证码的值用Session存储起来,通过对比用户提交的验证码和Session中的验证码,就可以知道输入是否正确。

把验证码存储在Cookie中

一般来说,我们会把验证码的值用Session存储起来,通过对比用户提交的验证码和Session中的验证码,就可以知道输入是否正确。由于Session会占用服务器资源,我曾经想过是否可以把验证码的值加密后存储在Cookie中。不过事实证明,这只是异想天开罢了。

假设验证码的值是a,通过sha1加密后得到的值为b = sha1(a),并且把b存储在Cookie中。而用户提交的验证码值为c,通过判断sha1(c)是否与b相等,可以知道输入的验证码是否正确。然而,Cookie是受客户端控制的。如果用户事先通过肉眼看到验证码的值是a,又从Cookie中得知此时的加密值为b,那么,他只要在提交前把Cookie的值修改为b,提交的验证码值为a,就可以永远通过验证。

[[268259]]

没有进行非空判断

这种情况可以直接用代码来说明:

  1. if (Request["captcha"] == Session["captcha"] as string) 
  2.  // 验证通过,继续操作 

假设用户绕过了系统提供的表单直接提交数据,此时验证码还没生成,Session["captcha"]为空。用户不提交验证码时,Request["captcha"]也为空。于是,验证通过了。

要解决这个问题,其实只要加个非空判断就可以了:

  1. if (!String.IsNullOrEmpty(Request["captcha"]) && 
  2.  Request["captcha"] == Session["captcha"] as string) 
  3.  // 验证通过,继续操作 

没有及时销毁验证码

使用验证码要遵循一个原则,在一次比对之后,无论用户输入正确与否,都要立刻将验证码销毁。

如果不这样做,就可以出现以下情况:

  • 假设用户输入错误,且验证码没有重新生成,那么他就可以一直尝试,直到正确为止。虽然机器对图片的一次性识别率比较低,但是,如果同一张图片你给它很多次机会的话,它还是可以识别出来的。
  • 假设用户输入成功,且验证码没有销毁,那么在Session过期之前,他就可以一直用这个验证码通过验证。

 

责任编辑:赵宁宁 来源: 今日头条
相关推荐

2013-06-19 10:19:59

2010-12-05 19:36:32

2021-01-19 10:29:34

短信验证码密码

2022-02-11 07:10:15

验证码

2020-11-16 07:28:53

验证码

2011-11-02 16:46:41

2011-11-02 12:43:33

2009-08-11 14:05:28

JSP验证码

2009-02-09 14:17:36

2015-03-23 17:58:04

验证码倒计时并行

2015-09-21 15:31:05

php实现验证码

2017-12-21 07:38:19

2022-01-20 10:54:23

移动手机短信验证码隐患

2016-11-03 13:33:31

2016-11-08 19:19:06

2009-11-26 10:48:59

PHP验证码

2015-03-17 09:28:04

2009-11-23 16:59:23

PHP图形验证码

2015-03-23 18:03:36

短信验证码正则自动填写
点赞
收藏

51CTO技术栈公众号