我们平常见到的验证码大都是数字验证码,或者高级点的数字+英文,对于中文汉字验证码还是比较少见的,像腾讯QQ的帐号验证就使用了中文验证码,当然中文验证码更加的安全,不过这给用户带来了麻烦,输入数字和字母总比汉字快一点。
此中文汉字验证码代码是在别人基础上增加的汉字功能,特此感谢,同时感谢鬼火狼烟。 以前的图片验证码很容易被破解,所以在其基础上进行改进,生成汉字,就目前而言很难破解。
用法:
在需要显示验证码图片的地方插入代码 <img src="code.asp" alt="请输入验证码">
同时,自动将值保存在session("psn"),表单提交验证session值是否和表单用户输入的一样就可以了。
显示效果截图:
代码中的显示效果相关设置说明:
Const codeLen = 4'验证码位数
Const cOdds = 4 '杂点出现的机率
Const dbtTimes = 1'干扰次数(安全考虑,最好不要小于2)
Const cAmount = 85 '字库数量
Const cCode = "好一路阳光子无开月了的比小山古天中石头井火大西木开人也叶九七六五合文只个鱼羊哈么点四生件格不步布各你田红蓝来很春下画京左百白东关工共足方尺才梦见查着去区曲寻早可上丰爱呵刘" '字库对应的字符
Const UnitWidth = 28'字宽(要为4的倍数)
Const UnitHeight = 28'字高
Const DotsLimit = 2'每次删除有效点的上限(避免无法人为识别)
Const tryCount = 2'避免删除有效点超过上限的尝试次数限制
Const cOdds = 4 '杂点出现的机率
Const dbtTimes = 1'干扰次数(安全考虑,最好不要小于2)
Const cAmount = 85 '字库数量
Const cCode = "好一路阳光子无开月了的比小山古天中石头井火大西木开人也叶九七六五合文只个鱼羊哈么点四生件格不步布各你田红蓝来很春下画京左百白东关工共足方尺才梦见查着去区曲寻早可上丰爱呵刘" '字库对应的字符
Const UnitWidth = 28'字宽(要为4的倍数)
Const UnitHeight = 28'字高
Const DotsLimit = 2'每次删除有效点的上限(避免无法人为识别)
Const tryCount = 2'避免删除有效点超过上限的尝试次数限制
字符颜色设置:
' 颜色的数据(字符,背景)
Dim vColorData(1)
vColorData(0) = ChrB(0) & ChrB(0) & ChrB(0) ' 蓝0,绿0,红0(黑色)
vColorData(1) = ChrB(255) & ChrB(255) & ChrB(255) ' 蓝250,绿236,红211(浅蓝色)
' 字符的数据(可以自己修改,如果修改了尺寸,记得把前面的设定也改了)
Dim vColorData(1)
vColorData(0) = ChrB(0) & ChrB(0) & ChrB(0) ' 蓝0,绿0,红0(黑色)
vColorData(1) = ChrB(255) & ChrB(255) & ChrB(255) ' 蓝250,绿236,红211(浅蓝色)
' 字符的数据(可以自己修改,如果修改了尺寸,记得把前面的设定也改了)
根据评论中两位网友对这个验证码的正确使用还存在一些疑问,这里我写一个使用的简单例子:
按下确定:
<%
'判断是否按下了确定按钮,如果按下了,则对比验证码是否输入正确
If Request.QueryString("submit") <> "" Then
Dim checkCode
checkCode = Trim(Request.QueryString("checkCode"))
If checkCode = Session("psn") Then
Response.Write("<script>alert('验证码正确');</script>")
Else
Response.Write("<script>alert('验证码错误');</script>")
End If
End If
%>
<form action="test.asp" method="get">
<input type="text" name="checkCode" />
<img src="code.asp" />
<input type="submit" name="submit" value="确定">
</form>
'判断是否按下了确定按钮,如果按下了,则对比验证码是否输入正确
If Request.QueryString("submit") <> "" Then
Dim checkCode
checkCode = Trim(Request.QueryString("checkCode"))
If checkCode = Session("psn") Then
Response.Write("<script>alert('验证码正确');</script>")
Else
Response.Write("<script>alert('验证码错误');</script>")
End If
End If
%>
<form action="test.asp" method="get">
<input type="text" name="checkCode" />
<img src="code.asp" />
<input type="submit" name="submit" value="确定">
</form>
与网友沟通,发现网友测试的时候,使用这样:
<img src="code.asp" />
<%=session("psn")%>
<%=session("psn")%>
结果每次显示的时候都是不相同的两个字符,所以就产生了疑问!这个session("psn")取得的是上一个产生的session。这个我的能力有限,也只能按照我的理解说一下:
这两句执行的时候,执行第一句就产生了一个session("psn"),但产生的速度有比下面的输出session("psn")快吗?答案是没有,产生一个session你可以看看code.asp里面的代码,所以第二句的session保留的还是上一个的session。你可以试下第一次执行的时候,第二句其实是什么都没有输出的,而到了我写的例子中的情况,则有足够的情况改变session的值。我是这样理解的,如果有不妥之处,欢迎不吝赐教!
源代码打包下载地址:cn_code.rar (7.16 KB)