飘易博客(作者:Flymorn)
订阅《飘易博客》RSS,第一时间查看最新文章!
飘易首页 | 留言本 | 关于我 | 订阅Feed

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

Author:Flymorn Source:飘易博客
Categories:Asp编程 PostTime:2008-3-2 0:27:23
正 文:
    序:本文撰写的前提是目前主流破解验证码的方法采用了OCR破解,而不是穷举法破解

    目前网络上有许多图片验证码形式,那些没有生成图片的验证码的抗破解防御能力简直不堪一击;有人直接在网页源码里显示出具体的数字,然后要求访问者输入一个相加后的和;如3+5=多少,这样的验证码新意倒有一些,不过可惜,根本没有起到保护的作用。

    flymorn改进一下以上的新意,直接把3+6=多少的形式采用asp程序生成Bmp图片格式,并且把数字相加后的和存进session里,加大破解的门槛;没有一些图形图像学知识的人是无法破解的。另外,你也可以把它改进成诸如 3x87 23x9 等形式的。代码如下:

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

<% 
Response.Buffer = True 
Response.ExpiresAbsolute = Now() - 1 
Response.Expires = 0 
Response.cachecontrol = "no-cache"

Response.ContentType = "Image/Bmp"  

Call Com_CreatValidCode()  

Sub Com_CreatValidCode()  

Randomize  

Dim i, ii, iii  

Const cAmount = 10 '数值个数

Const cCode = "0123456789"  '数值范围

Dim vColorData(2)

vColorData(0) = "" '黑色点要转为彩色点,暂时不定义

vColorData(1) = ChrB(255) & ChrB(255) & ChrB(255) '白点

Dim vCode(4), vCodes '产生一组任意数

For i = 0 To 3  

vCode(i) = Int(Rnd * cAmount) '数组等于总数*随机数

if i=1 then vCode(i)="11"  '第二位为+

if i=3 then vCode(i)="10"  '第四位为=

vCodes=vCodes&Mid(cCode,vCode(i)+1,1) '串等于串加上后续值

Next  

session("checkcode")=int(Mid(vCodes,1,1)) + int(Mid(vCodes,2,1)) '计算相加和值并赋值给session

Dim vNumberData(36)  

vNumberData(0) = 

"1110000111110111101111011110111101111011110111101111011110111101111011110111101111011110111110000111"  

vNumberData(1) = 

"1111011111110001111111110111111111011111111101111111110111111111011111111101111111110111111100000111"  

vNumberData(2) = 

"1110000111110111101111011110111111111011111111011111111011111111011111111011111111011110111100000011"  

vNumberData(3) = 

"1110000111110111101111011110111111110111111100111111111101111111111011110111101111011110111110000111"  

vNumberData(4) = 

"1111101111111110111111110011111110101111110110111111011011111100000011111110111111111011111111000011"  

vNumberData(5) = 

"1100000011110111111111011111111101000111110011101111111110111111111011110111101111011110111110000111"  

vNumberData(6) = 

"1111000111111011101111011111111101111111110100011111001110111101111011110111101111011110111110000111"  

vNumberData(7) = 

"1100000011110111011111011101111111101111111110111111110111111111011111111101111111110111111111011111"  

vNumberData(8) = 

"1110000111110111101111011110111101111011111000011111101101111101111011110111101111011110111110000111"  

vNumberData(9) = 

"1110001111110111011111011110111101111011110111001111100010111111111011111111101111011101111110001111"  

'表示=
vNumberData(10) = 

"1111111111111111111111111111111000000001111111111111111111111000000001111111111111111111111111111111"  
'表示+
vNumberData(11) = 

"1111111111111100111111110011111111001111100000000110000000011111001111111100111111110011111111111111"  


Response.BinaryWrite ChrB(66) & ChrB(77) & ChrB(230) & ChrB(4) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) &_  

ChrB(0) & ChrB(0) & ChrB(54) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(40) & ChrB(0) &_  

ChrB(0) & ChrB(0) & ChrB(40) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(10) & ChrB(0) &_  

ChrB(0) & ChrB(0) & ChrB(1) & ChrB(0)  

Response.BinaryWrite ChrB(24) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(0) & ChrB(176) & ChrB(4) &_  

ChrB(0) & ChrB(0) & ChrB(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 = 9 To 0 Step -1 '行

For ii = 0 To 3  '字数

For iii = 1 To 10 '像素点

  if Mid(vNumberData(vCode(ii)), i * 10 + iii , 1)  ="0" then '产生彩色点,减去一个固定值,可使颜色偏深

    dim a,b,c

    a=abs(Rnd * 256-60)

    b=abs(Rnd * 256-128)

    c=abs(Rnd * 256-60)

    vColorData(0) = ChrB(a) & ChrB(b) & ChrB(c) 

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

  else

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

    d=abs(Rnd * 255)

    e=abs(Rnd * 255)

    f=abs(Rnd * 255)

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

      vColorData(1) = ChrB(d) & ChrB(e) & ChrB(f) 

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

    else

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

    end if

  end if

Next  

Next  

Next  

End Sub  
%> 

    以上代码可直接另存为一个文件,如vcode.asp,然后通过图片的方式调用改文件,如<img src="vcode.asp" border=0 align="absmiddle" />,然后在提交后的处理页面里验证session("checkcode")的值就可以了。这个代码是flymorn自己改进的,原始的参考代码请直接在google里搜索“用ASP生成Bmp图片”,或查看这个网址,可以找到一些相关的。

    最后,就是“5+6=”这样的随机数字相加的形式生成在bmp图片里了,它们的和需要你计算后填入,以达到验证的功能,防止机器蹂躏你的网站。如果你也关心asp图片验证码,欢迎留言,让我们一起交流。

    PS:更新。看了下面的一些朋友的评论,说图片无法显示,这是因为大家在拷贝的时候,没有注意有些换行不是必要的;flymorn就给大家提供源码下载吧。
作者:Flymorn
来源:飘易博客
版权所有。转载时必须以链接形式注明作者和原始出处及本声明。
上一篇:批量查询友情链接网站在百度里的收录数量--SEO工具
下一篇:搜狗、有道搜索的一些创新
21条评论 “ASP生成BMP图片验证码:数字相加求和”
1 你的程序蛮强的
2008-3-3 15:35:47
你的程序蛮强的
2008-3-7 9:38:04
I 服了 you!
2008-6-10 13:09:56
太历害了,那我这有个问题想请教一下,如何将从flash程序中截下来的视频图片保存成jpeg格式的图片呀,
51.com 里的照相功能知道吧!
2008-7-8 15:29:52
不知道为什么,无法显示图片。一个红X
5 孟汉华
2008-9-15 22:45:15
老大  看了你这个很强  我的小站经常被群发机骚扰    看了你的这个感觉很好,就是最后一句话看不明白

然后在提交后的处理页面里验证session("checkcode")的值    这段代码在判断处理页面的完整代码是怎么写呢, 能不能发个完整的判断页面代码 发我邮件啊 老大    mhhsdl@163.com 非常感谢啊
6 园园
2008-10-9 10:58:06
和4楼的一们,不知道为什么,无法显示图片。一个红X

是不是代码有出错了,调用不显示??
7 老大
2008-10-15 13:47:02
不行啊 红X,无法显示
8 园园
2008-10-18 10:49:31
图片无法显示,这是因为大家在拷贝的时候,没有注意有些换行不是必要的

谢谢楼主指点,提供!现在看到图片
9 yuanyuan
2008-10-18 11:46:18
这段代码在判断处理页面的完整代码是怎么写呢?

我试了好几次不成功,唯一想来这里请教一下楼主!方便可以发到我的邮箱bidaofang@163.com 在此先谢谢了!

支持飘易网站!
10 FLYMORN
2008-10-18 11:56:58
验证的时候到另外另一个页面验证。
11 阿平
2008-10-18 13:45:58
我也想求这段代码在判断处理页面的完整代码是怎么写的?

希望各位帮帮忙!
12 觉觉
2008-10-18 15:36:24
好像感觉session("checkcode")计算的值不正确,计算不出来,现在想搞个判断语句不成功,不知道是怎么回事?
13 阿素
2008-10-18 16:24:08
<% 
'判断是否按下了确定按钮,如果按下了,则对比验证码是否输入正确 

Dim vcode 
vcode=request("vcode")

response.Write ""&session("checkcode")&""
response.Write ""&request("vcode")&""

%> 


<% 
'判断是否按下了确定按钮,如果按下了,则对比验证码是否输入正确 

'判断是否按下了确定按钮,如果按下了,则对比验证码是否输入正确 

 
 if request("vcode")="" then
 Response.Write("<script language=javascript>alert('验证码不能为空');history.go(-1);</script>") 
 end if
 

 if request("vcode")=session("checkcode") then
 
         Response.Write("<script language=javascript>alert('正确');history.go(-1);</script>")
      else
             Response.Write("<script language=javascript>alert('验证码错误');history.go(-1);</script>")
      end if

%> 

这是判断页面,不知道是错在那里,验证好多次都不成功!
14 flymorn
2008-10-18 16:51:23
在最终页面这样验证:
if Session("checkcode")="" or cstr(Session("checkcode")) <> cstr(request.form("vcode")) then
response.write "<SCRIPT language=JavaScript>alert('验证码错误!');"
response.write "this.location.href='vbscript:history.back()';</SCRIPT>"
response.end
end if
15 园园
2008-10-20 10:33:55
我已经把上面的验证码用上去了,网址:http://cd368.com/cd368/book/guest999.asp

可好像发现一个缺点,过一段时间它还是有垃圾,怀疑机器那些软件把答案止终设置为随便一个字,假如答案“6”----因为答案范围就是1-20之间,我们刷新几次验证码,6答案就答对了,就让它通过了。。。机器最多需要些短短时间就可以通过了。。。

不知道还有没有其它的办法?
16 toto19850202
2008-11-4 13:41:39
不错的啊.非常不错.
17 逸舟
2009-2-10 15:35:23
这个不错,如要要实现四则运行 那加减乘除 如何表示? vNumberData(11) = 
"1111111111111100111111110011111111001111100000000110000000011111001111111100111111110011111111111111 像这些是表示什么?可以发邮件告诉我吗?
18 可以用
2009-3-19 0:36:41
复制下来后~把换行去掉~我也想学习原理~
19 我不行啊
2009-11-3 15:36:08
大哥,我比较迟钝。和楼上的一样,我的显示出来还是个大红叉。不介意发个保存了的文件过来吧。发我邮箱,先谢了!
20 思路不错
2010-3-9 15:35:29
思路不错,不过一位数的加法变化太少,就象15楼说的方法很容易突破。
2010-10-12 17:00:49
保定博大网络设计工作室有丰富的网站建设经验,专业提供保定网站建设,保定做网站,保定建网站,保定网站制作,保定网页制作,保定网页设计服务,全力打造保定最优秀的建站公司。保定博大网络是保定网站建设,企业建站,公司建站的理想之选。
发表评论
名称(*必填)
邮件(选填)
网站(选填)

记住我,下次回复时不用重新输入个人信息
© 2007-2010 飘易博客 Www.Piaoyi.Org 原创文章版权由飘易所有 渝ICP备07006361号