ASP验证码代码下载_第1页
ASP验证码代码下载_第2页
ASP验证码代码下载_第3页
ASP验证码代码下载_第4页
ASP验证码代码下载_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、<%'-'图片验证码'netdust'05-8-29 发布'以前的图片验证码很容易被破解,所以在其基础上进行改进,即使知道源代码'也很难破解。'干扰次数每加一   ->   穷举法的代价提高约100*100倍'适当设定杂点几率可以有效降低软件识别正确率'05-12-20 修正了一个错误'- Option Explicit Call Com_CreatValidCode("GetCode") Rem 生成验

2、证码图片Sub Com_CreatValidCode(pSN)Const codeLen = 4 '验证码位数Const cOdds = 3 '杂点出现的机率Const dbtTimes = 1 '干扰次数(安全考虑,最好不要小于3) Const cAmount = 10 '字库数量Const cCode = "0123456789" '字库对应的字符Const UnitWidth = 16 '字宽(要为4的倍数)Const UnitHeight = 13 '字高Const DotsLimit = 5 

3、9;每次删除有效点的上限(避免无法人为识别)Const tryCount = 5 '避免删除有效点超过上限的尝试次数限制 '- RandomizeDim i, ii, iii ' 禁止缓存Response.Expires = -9999Response.AddHeader "Pragma","no-cache"Response.AddHeader "cache-ctrol","no-cache"Response.ContentType = "Image

4、/BMP" ' 颜色的数?字符,背景)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 vNumberData(9)vNumberData(0) =

5、"1111000000001111111000000000011111100111111001111110011111100111111001111110011111100111111001111110011111100111111001111110011111100111111001111110011111100111111001111110011111100000000001111111000000001111"vNumberData(1) = "111111000111111111110000011111111110000001111111110011000

6、1111111111111000111111111111100011111111111110001111111111111000111111111111100011111111111110001111111111111000111111111100000000011111110000000001111"vNumberData(2) = "111111000001111111111000000011111111000111001111111000111100111111111111100111111111111100111111111111100111111111111100

7、1111111111111001111111111111001111001111111001111100111111100000000011111110000000001111"vNumberData(3) = "111110000001111111110000000011111110011111100111111001111100111111111111100111111111111000111111111111100011111111111111100111111111111111001111111001111110011111100111111001111111000

8、0000011111111100000011111"vNumberData(4) = "1111111100111111111110110011111111110011001111111111001100111111111001110011111111001111001111111000000000000011100000000000001111111111001111111111111100111111111111110011111111111111001111111111111100111111"vNumberData(5) = "111000000

9、0000111110011111111111111001111111111111100111111111111110011111111111111001100000011111100000111100111111111111110011111111111111001111111111111100111110011111110011111001111111001111110000000001111"vNumberData(6) = "111111000001111111111000000011111111001111100111111001111111111111100111

10、1111111111100100000111111110000000001111111000111110011111100111111001111110011111100111111001111110011111110000000011111111100000011111"vNumberData(7) = "111000000000011111100000000001111110011111100111111001111110011111111111110011111111111111001111111111111001111111111111001111111111111

11、1001111111111111100111111111111110011111111111111001111111111111100111111"vNumberData(8) = "111110000001111111110000000011111110011111100111111001111110011111100111111001111111000000001111111100000000111111110011110011111110011111100111111001111110011111100111111001111111000000001111111110

12、0000011111"vNumberData(9) = "1111100000011111111100000000111111100111111001111110011111100111111001111110011111110000000001111111000000100111111111111110011111111111111001111111111111100111111001111100111111110000000011111111100000011111" ' 随机产生字符Dim vCodesReDim vCode(codeLen

13、-1)For i = 0 To codeLen-1   vCode(i) = Int(Rnd * cAmount)   vCodes = vCodes & Mid(cCode, vCode(i) + 1, 1)   vCode(i) = pcd_doubter(vNumberData(vCode(i),UnitWidth,UnitHeight,DotsLimit,tryCount,dbtTimes)Next Session(pSN) = vCodes   '记录入Session 

14、' 输出图像文件头Response.BinaryWrite ChrB(66) & ChrB(77) & Num2ChrB(54+UnitWidth*UnitHeight*CodeLen*3,4) & ChrB(0) & ChrB(0) &_   ChrB(0) & ChrB(0) & ChrB(54) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(40) & ChrB(0) &_   ChrB(0) & Ch

15、rB(0) & Num2ChrB(UnitWidth*CodeLen,4) & Num2ChrB(UnitHeight,4) &_   ChrB(1) & ChrB(0) ' 输出图像信息头Response.BinaryWrite ChrB(24) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) & Num2ChrB(UnitWidth*UnitHeight*CodeLen*3,4) &_   Ch

16、rB(18) & ChrB(11) & ChrB(0) & ChrB(0) & ChrB(18) & ChrB(11) &_   ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) &_   ChrB(0) & ChrB(0) For i = UnitHeight-1 To 0 Step -1   

17、9; 历经所有行   For ii = 0 To codeLen-1   ' 历经所有字   For iii = 1 To UnitWidth ' 历经所有像素       If Rnd * 99 + 1 >= cOdds Then ' 逐行、逐字、逐像素地输出图像数据      Response.BinaryWrite vColorData(Mid(vCo

18、de(ii), i * UnitWidth + iii, 1)       Else ' 随机生成杂点      Response.BinaryWrite vColorData(1-CInt(Mid(vCode(ii), i * UnitWidth + iii, 1)       End If   Next   NextNextEnd Sub Rem 对单个字

19、的点阵进行干扰Rem 干扰思想:在点阵范围内随机产生2个端点,进行连线,以位移较大的一方做横轴,先将连线上的点删除,再将被删除点的纵轴方向上方或下方的点(随机确定)移向被删除点,移动后的空白用背景色补充Function pcd_doubter(ByVal str,UnitWidth,UnitHeight,DotsLimit,tryCount,dbtTimes)RandomizeDim x1,x2,y1,y2,xOffSet,yOffSet,direction,flag,rows,step,yu,yuStr,i,ii,iii,f1,f2For f1=1 To dbtTimes '干扰次数

20、For f2=1 To tryCount '避免删除有效点超过上限的尝试次数限制'随机确定2个端点x1 = int(Rnd*UnitWidth)x2 = int(Rnd*UnitWidth)y1 = int(Rnd*UnitHeight)y2 = int(Rnd*UnitHeight)'x,y位移量xOffSet = Abs(x2-x1)yOffSet = Abs(y2-y1)If xOffSet >= yOffSet Then '以位移量较大方做横轴direction = "x"ReDim ary(xOffSet) '用来记录

21、连线各点y值'x2,y2存储x值较大的点If x2 < x1 Theni = x1x1 = x2x2 = ii = y1y1 = y2y2 = iEnd If'判断从x1->x2在纵轴方向上是增是减If y2 >= y1 Thenflag = 1Elseflag = -1End If'下面计算连线上点的分布(先是平均分配各行的点,然后随机分配剩余的点到各行)rows = yOffSet + 1 '所占行数step = (xOffSet+1) rows '各行平均分配的点yu = (xOffSet+1) Mod rows '剩余的

22、点数ReDim ary2(rows-1) '用来记录剩余点的随机分配While yu > 0i = int(Rnd*rows)ary2(i) = ary2(i)&"." '被分配到的行则加一个字符"."yu = yu - 1WEndiii = 0'将连线的点信息记录到数组For i=0 To rows-1For ii=1 To step+Len(ary2(i)ary(iii) = y1 + i*flagiii = iii + 1NextNextii = 0'统计连线上有效点的数量For i=0 To xOff

23、SetIf pcd_getDot(x1+i,ary(i),str,UnitWidth) = "0" Then ii = ii + 1NextElse'这里是以y为横轴,原理与x时相同direction = "y"ReDim ary(yOffSet)If y2 < y1 Theni = x1x1 = x2x2 = ii = y1y1 = y2y2 = iEnd IfIf x2 >= x1 Thenflag = 1Elseflag = -1End Ifrows = xOffSet + 1step = (yOffSet+1) rowsyu

24、= (yOffSet+1) Mod rowsReDim ary2(rows-1)While yu > 0i = int(Rnd*10)If i < rows Thenary2(i) = ary2(i)&"."yu = yu - 1End IfWEndiii = 0For i=0 To rows-1For ii=1 To step+Len(ary2(i)ary(iii) = x1 + i*flagiii = iii + 1NextNextii = 0For i=0 To yOffSetIf pcd_getDot(ary(i),y1+i,str,UnitWi

25、dth) = "0" Then ii = ii + 1NextEnd If'如未超过有效点上限则跳出循环,执行干扰If ii <= DotsLimit Then Exit ForNext If direction = "x" Then'随机确定在纵轴方向上或下进行移动If int(Rnd*10) > 4 Then'变量连线上的点For i=0 To xOffSet'遍历移动For ii=ary(i) To 1 Step -1Call pcd_setDot(x1+i,ii,str,pcd_getDot(

26、x1+i,ii-1,str,UnitWidth),UnitWidth)Next'添补空白Call pcd_setDot(x1+i,0,str,"1",UnitWidth)NextElseFor i=0 To xOffSetFor ii=ary(i) To UnitHeight-2Call pcd_setDot(x1+i,ii,str,pcd_getDot(x1+i,ii+1,str,UnitWidth),UnitWidth)NextCall pcd_setDot(x1+i,UnitHeight-1,str,"1",UnitWidth)NextEn

27、d IfElseIf int(Rnd*10) > 4 ThenFor i=0 To yOffSetFor ii=ary(i) To 1 Step -1Call pcd_setDot(ii,y1+i,str,pcd_getDot(ii-1,y1+i,str,UnitWidth),UnitWidth)NextCall pcd_setDot(0,y1+i,str,"1",UnitWidth)NextElseFor i=0 To yOffSetFor ii=ary(i) To UnitWidth-2Call pcd_setDot(ii,y1+i,str,pcd_getDot(

28、ii+1,y1+i,str,UnitWidth),UnitWidth)NextCall pcd_setDot(UnitWidth-1,y1+i,str,"1",UnitWidth)NextEnd IfEnd IfNextpcd_doubter = strEnd Function Rem 得到某点的字符Function pcd_getDot(x,y,str,UnitWidth)pcd_getDot = Mid(str,x+1+y*UnitWidth,1)End Function Rem 设置某点的字符Sub pcd_setDot(x,y,ByRef str,newDot,UnitWidth)str = Left(str,x+y*UnitWidth) & newDot & Right(str,Len(str)-x-y*UnitWidth-1)End Sub Rem 将数字转为bmp需要的格式 lens是目标字节长度Function Num2ChrB(num,lens)Dim ret,iret = ""While (num>0)ret = ret & ChrB(num mod 256)num = num 256WEndFor i=Lenb(ret) To

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论