关于实现验证码需要注意的问题

缘起:

如果能在用户输入验证码后就知道输入是否正确的话,用户体验会好很多,而且对于难以识别的验证码还能给用户重新输入的机会。【后来才发现,允许重新尝试同一个验证码本身就是有安全问题的

思考:

方案1: 验证码不和真实业务数据一起提交的话,而是验证码先提交,如果验证码正确则换取一张有效的凭证,然后将凭证和真实业务数据一起提交;否则刷新验证码(安全考虑,验证码必须验证一次后失效),重新输入

方案2: 生成验证码图片的时候,将验证码的hash值返回给用户端,这样,用户输入验证码后,通过js来比较hash值,就可以在很大程度上预判验证码的正确性了,因为同一个验证码可以尝试多次(这本身就是个漏洞)。

安全方面的考虑:

  1. 如果hash值是对验证码直接做的hash,则:
    1) 可以生成一个足够大的hash值的数据库,直接根据hash值反解出验证码
    2) 图片验证码的识别技术 + 根据hash值的进一步校验,使得验证码的破解成功率大大提高
    3) 可能有一个足够强大的计算平台,根据一定的规则反解hash值
  2. 或许可以对验证码和一个临时的随机串来一起来做hash值,如此,则:
    1) 图片验证码的识别技术 + 根据hash值的进一步校验,使得验证码的破解成功率大大提高
    3)   可能有一个足够强大的计算平台,根据一定的规则反解hash值
  3. 理论上来讲,验证码必须只能验证一次后失效,否则:
    1) 图片验证码的识别技术 + 根据hash值的进一步校验,使得验证码的破解成功率大大提高

 结论:

方案1 基本可行,但是要对验证码的尝试做IP封禁策略

方案2 对于不太关键的业务或许可以临时用一下

 

验证码服务模型

1. 一个输出验证码的接口,同时输出验证码的id

2. 一个验证验证码的接口,可能会输出验证成功的票据(票据是一次性的)

3. 一个验证票据的接口

 

票据的引入为了处理这种情况: 提交的数据量比较大,如果提交后报告验证码错误,显得很没有效率;这种情况,就可以先验证验证码,验证码成功后再提交数据,但是需要借助票据来实现

 

留下评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据