短信验证码程序设计

验证码使用后,应对其进行清除,不可二次使用

1、通过session实现,session["VerCode"]="15004604582,236754";  这样验证码的有效期与系统登录的会话周期发生冲突,

对于小型项目对验证码的有效期要求不高者,可以使用。还可以在返回验证码的action中设置定时器,定期清空session["VerCode"],过于繁琐。

2、通过系统服务器缓存实现,key(tel)=value(vercode) 设置缓存绝对过期时间,若服务器内存紧张,易被释放。

3、通过传统关系型数据库实现,表设计:手机号、验证码、过期时间,此表将手机号设成主键或设成唯一索引且包含验证码和过期时间,效率很高,当然也可定期人为清空过期数据或sql计划清除,如果不单独创建验证码表,可将验证码和过期时间整合到用户表,但注册时用户信息不存在,可采用方案2来实现注册验证。

4、使用mongodb实现,在MongoDB中创建可过期自动删除的数据集合即可。

5、使用Redis和memcache与方案2基本类似,但需搭建缓存服务器,在大型分布式系统中,客户端每次访问不一定会路由到同一台服务器,这样方案2就需要在各个服务器之间同步缓存,占用带宽,每个服务器的缓存数据一致数据冗余浪费资源,时效性差,此时应搭建分布式缓存数据库,从一台服务器或一个分布式集群中获取缓存数据。

 

注意:以上设计存在漏洞,软件A模块获取验证码不使用,在B模块使用仍然有效,但验证码是为防止非本人操作,从这点来分析影响不大,具体根据项目需求设计。

解决方案:session["VerCode"]="15004604582,236754,模块名称";key(tel)=value(vercode,模块名称),数据库的方式可以增加一个模块名称的字段,来确保当前验证码

只有在本模块使用才有效,A模块获取验证码后 ,不使用,B模块获取验证码后A模块验证码失效。

posted on 2018-02-06 13:18  无缘沙漠雨  阅读(315)  评论(0)    收藏  举报

导航