ASP将数字相加求和生成BMP图片验证码

现在的广告推广是越来越嚣张了,时不时网站给发几个广告,所以我们可以在评论和留言的时候利用验证码来阻止一部分的广告。目前网络上常用的是图片验证码的形式,下面给出的是增强型验证码,即把数字求和采用asp程序生成Bmp图片格式,并且把数字相加后的和存进session里,这样就能达到很大程度上的防广告灌水效果。你也可以把它改进成诸如 3x87 23x9 等形式的。代码如下:

 

vb 代码
 
  1. <% 
  2. Response.Buffer = True 
  3. Response.ExpiresAbsolute = Now() - 1 
  4. Response.Expires = 0 
  5. Response.cachecontrol = "no-cache" 
  6. Response.ContentType = "Image/Bmp"   
  7. Call Com_CreatValidCode()   
  8. Sub Com_CreatValidCode()   
  9. Randomize   
  10. Dim i, ii, iii   
  11. Const cAmount = 10 '数值个数 
  12. Const cCode = "0123456789"  '数值范围 
  13. Dim vColorData(2) 
  14. vColorData(0) = "" '黑色点要转为彩色点,暂时不定义 
  15. vColorData(1) = ChrB(255) & ChrB(255) & ChrB(255) '白点 
  16. Dim vCode(4), vCodes '产生一组任意数 
  17. For i = 0 To 3   
  18. vCode(i) = Int(Rnd * cAmount) '数组等于总数*随机数 
  19. if i=1 then vCode(i)="11"  '第二位为+ 
  20. if i=3 then vCode(i)="10"  '第四位为= 
  21. vCodes=vCodes&Mid(cCode,vCode(i)+1,1) '串等于串加上后续值 
  22. Next   
  23. session("checkcode")=int(Mid(vCodes,1,1)) + int(Mid(vCodes,2,1)) '计算相加和值并赋值给session 
  24. Dim vNumberData(36)   
  25. vNumberData(0) =  
  26. "1110000111110111101111011110111101111011110111101111011110111101111011110111101111011110111110000111"   
  27. vNumberData(1) =  
  28. "1111011111110001111111110111111111011111111101111111110111111111011111111101111111110111111100000111"   
  29. vNumberData(2) =  
  30. "1110000111110111101111011110111111111011111111011111111011111111011111111011111111011110111100000011"   
  31. vNumberData(3) =  
  32. "1110000111110111101111011110111111110111111100111111111101111111111011110111101111011110111110000111"   
  33. vNumberData(4) =  
  34. "1111101111111110111111110011111110101111110110111111011011111100000011111110111111111011111111000011"   
  35. vNumberData(5) =  
  36. "1100000011110111111111011111111101000111110011101111111110111111111011110111101111011110111110000111"   
  37. vNumberData(6) =  
  38. "1111000111111011101111011111111101111111110100011111001110111101111011110111101111011110111110000111"   
  39. vNumberData(7) =  
  40. "1100000011110111011111011101111111101111111110111111110111111111011111111101111111110111111111011111"   
  41. vNumberData(8) =  
  42. "1110000111110111101111011110111101111011111000011111101101111101111011110111101111011110111110000111"   
  43. vNumberData(9) =  
  44. "1110001111110111011111011110111101111011110111001111100010111111111011111111101111011101111110001111"   
  45. '表示=
  46. vNumberData(10) =  
  47. "1111111111111111111111111111111000000001111111111111111111111000000001111111111111111111111111111111"  
  48. '表示+
  49. vNumberData(11) =  
  50. "1111111111111100111111110011111111001111100000000110000000011111001111111100111111110011111111111111"   
  51. Response.BinaryWrite ChrB(66) & ChrB(77) & ChrB(230) & ChrB(4) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) &_   
  52.  
  53. ChrB(0) & ChrB(0) & ChrB(54) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(40) & ChrB(0) &_   
  54.  
  55. ChrB(0) & ChrB(0) & ChrB(40) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(10) & ChrB(0) &_   
  56.  
  57. ChrB(0) & ChrB(0) & ChrB(1) & ChrB(0)   
  58.  
  59. Response.BinaryWrite&nb
    sp;ChrB(24) & 
    ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(176) & ChrB(4) &_   
  60.  
  61. ChrB(0) & ChrB(0) & ChrB(18) & ChrB(11) & ChrB(0) & ChrB(0) & ChrB(18) & ChrB(11) &_   
  62.  
  63. ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) &_   
  64.  
  65. ChrB(0) & ChrB(0)   
  66.  
  67. For i = 9 To 0 Step -1 '行 
  68.  
  69. For ii = 0 To 3  '字数 
  70.  
  71. For iii = 1 To 10 '像素点 
  72.  
  73.   if Mid(vNumberData(vCode(ii)), i * 10 + iii , 1)  ="0" then '产生彩色点,减去一个固定值,可使颜色偏深 
  74.  
  75. dim a,b,c 

  76.  
  77. a=abs(Rnd * 256-60) 

  78.  
  79. b=abs(Rnd * 256-128) 

  80.  
  81. c=abs(Rnd * 256-60) 

  82.  
  83. vColorData(0) = ChrB(a) & ChrB(b) & ChrB(c)  

  84.  
  85. Response.BinaryWrite vColorData(Mid(vNumberData(vCode(ii)), i * 10 + iii , 1))   

  86.  
  87.   else 
  88.  
  89. dim d,e,f '产生彩色背景,颜色偏浅,也可以随机生成噪点做背景 

  90.  
  91. d=abs(Rnd * 255) 

  92.  
  93. e=abs(Rnd * 255) 

  94.  
  95. f=abs(Rnd * 255) 

  96.  
  97. if d+e+f>640 then  '可改值,调整背景色深 

  98.  
  99.   vColorData(1) = ChrB(d) & ChrB(e) & ChrB(f)  

  100.  
  101.   Response.BinaryWrite vColorData(Mid(vNumberData(vCode(ii)), i * 10 + iii , 1))   

  102.  
  103. else 

  104.  
  105.   Response.BinaryWrite vColorData(Mid(vNumberData(vCode(ii)), i * 10 + iii , 1))   

  106.  
  107. end if 

  108.  
  109.   end if 
  110.  
  111. Next   
  112.  
  113. Next   
  114.  
  115. Next   
  116.  
  117. End Sub  
  118. %> 

 直接将以上代码另存为一个文件,如yzcode.asp,然后通过图片的方式调用此文件,如<img src="yzcode.asp" border=0 align="absmiddle" />,然后在提交后的处理页面里验证session("checkcode")的值就可以了。

最后,就是“5+6=”这样的随机数字相加的形式生成在bmp图片里了,它们的和需要你计算后填入,以达到验证的功能,防止机器蹂躏你的网站。

PS:大家在拷贝的时候,没有注意有些换行不是必要的;请认真对照代码