网站认证码的设计
目的:
目前网站认证码,存在缺陷,认证码是存放在Cookie中,存在极大的安全隐患,而且同个浏览器同时打开两个有认证码的页面,后打开的页面上的认证码,会覆盖掉前一个的认证码,。这次要设计一个稳定安全、可扩展和性能较高的认证码系统。
接口定义
前台脚本
1、GetRenZhengHtml()
返回Html脚本,包括一个隐含的Input和一个图片链接,图片有Java的Servlet生成。
例如:
<input type=”hidden” name=”renzid” id=”renzid” value=”随机生成的16位字符串”>
<img οnclick=”ReIntiRenZheng(this)” src=” servlet/RandImageServlet?id=随机生成的16位字符串”>
2、ReIntiRenZheng(theImg)
重新生成随机字符串,设置认证码和图片链接
一般用法:
<form ...>
<input ....>
...
<script>document.write(GetRenZhengHTML())</script>
...
</form>
后台检查认证码接口Java
类:com.cnblogs.renzhengcode.CheckRenZhengCode
Public static boolean check( renzhengid,renzcode)
验证认证码是否正确,
正确,返回true;否则,返回false
Renzhengid : 系统生成的随机16位十六进制数字认证ID
Renzcode:用户根据图片上的字符输入的认证码
实现细节
基本实现流程图
数据库名称:RenZhengDB
表结构
字段名 | 名称 | 类型 | 说明 |
RZID | 16位随机字符串 | Varchar2(16) | 作为钥匙匹配 |
RZCode | 认证码 | Varchar2(4) | 用户输入 |
GENDATE | 生成时间 | Datatime | 用于清除过期认证码 |
无主键,但是RZID需建立索引
存储过程
P_CreateRenZhengCode @RenZhengID char(16) @RenZhengCode char(4)
功能:直接插入一条记录,createTime为当前时间。
参数: @RenZhengID 随机产生的16位字符串
@RenZhengCode 4位认证码
P_CheckRenZhengCode @RenZhengID char(16) @RenZhengCode char(4)
功能:根据输入的参数,查找符合的记录,有,返回1,并且删除该记录;没有,则返回0
参数:@RenZhengID 随机产生的16位字符串
@RenZhengCode 4位认证码
返回:
如果1,则通过认证码的验证
否则 0,认证出错
数据库定时清除过期认证码的Job
初步定为,每过10分钟清一次10分钟之前的认证记录。
P_ClearOverdueRenZhengCode
参数:无
为Job调用。