现在大多数网站都采用了验证码来防止暴力**或恶意提交。但验证码真的就很安全吗?真的就不能被机器识别??
我先讲讲我是怎么实现站外提交留言到一个网站的程序。
这个网站的留言版大致如下:

自动识别图形验证码


我一看这种简单的4位数字验证码,马上就感觉到有戏了。直觉告诉我让电脑来识别这些图片验证码据对简单o(∩_∩)o...
首先我马上在这个页面用右键菜单看源代码
自动识别图形验证码

知道验证码获取页面后 你可以直接用 http://www.XXXX.com/imgchk/validatecode.asp 这样去访问你会发现你打开的就是一个验证码图片。

自动识别图形验证码


对的其实返回的就是图片文件的2进制流而已。接着先用右键保存一张验证码的图片。因为要开始分析这张图片了,什么用什么工具?PhotoShop????不用就一般的画图工具就可以了。我们要搞清楚的是 这几个数字分别占几个像素就可以了。

自动识别图形验证码


可以看出 一个数字5*9 也就是45个像素。恩 这就可以了 另外我们可以看出 默认区域就是白色
(姑且说是白色因为我们肉眼看就是白色)
那么我的程序识别原理就是固定去扫描这45个像素点。看每个点的颜色是不是和默认的颜色一致
一致的话就标记为0 ,不一致就标记为1 。
如一个数子是2 那么我的程序扫描出来的图像就应该是:
011110
100001
000001
000001
000010
000100
001000
010000
100000
111111
如果一个数字是7那么扫描出来的图像就是:
111111
100001
000010
000010
000100
000100
001000
001000
010000
010000

恩,就这么简单呵呵。下面给出图像 扫描的java类 (不好意思,在我会的语言里面除开java就剩sql了)
自动识别图形验证码
自动识别图形验证码
自动识别图形验证码
自动识别图形验证码
packagecom.util;
自动识别图形验证码
自动识别图形验证码
//~---JDKimports------------------------------------------------------------
自动识别图形验证码

自动识别图形验证码
importcom.sun.image.codec.jpeg.JPEGCodec;
自动识别图形验证码
importcom.sun.image.codec.jpeg.JPEGEncodeParam;
自动识别图形验证码
importcom.sun.image.codec.jpeg.JPEGImageEncoder;
自动识别图形验证码
自动识别图形验证码
importjava.awt.*;
自动识别图形验证码
importjava.awt.image.*;
自动识别图形验证码
自动识别图形验证码
importjava.io.*;
自动识别图形验证码
importjava.io.FileOutputStream;
自动识别图形验证码
importjava.io.OutputStream;
自动识别图形验证码
自动识别图形验证码
importjava.net.*;
自动识别图形验证码
自动识别图形验证码
importjavax.imageio.*;
自动识别图形验证码
importjavax.imageio.ImageIO;
自动识别图形验证码
自动识别图形验证码自动识别图形验证码
/***//**
自动识别图形验证码*登陆验证图片转换为数字
自动识别图形验证码*
自动识别图形验证码*
自动识别图形验证码*
@version1.0,08/04/20
自动识别图形验证码*
@author张健滢
自动识别图形验证码
*/

自动识别图形验证码自动识别图形验证码
publicclassImgIdent...{
自动识别图形验证码
自动识别图形验证码
//数字字符比特表
自动识别图形验证码自动识别图形验证码
privatefinallong[][]NUMERIC=...{
自动识别图形验证码自动识别图形验证码
...{512104545,562436190},//'0'
自动识别图形验证码自动识别图形验证码
...{148931080,136348222},//'1'
自动识别图形验证码自动识别图形验证码
...{511971394,69273663},//'2'
自动识别图形验证码自动识别图形验证码
...{511971406,17045598},//'3'
自动识别图形验证码自动识别图形验证码
...{35168914,586948743},//'4'
自动识别图形验证码自动识别图形验证码
...{1065486398,17045598},//'5'
自动识别图形验证码自动识别图形验证码
...{239208494,830871646},//'6'
自动识别图形验证码自动识别图形验证码
...{1065623684,69239824},//'7'
自动识别图形验证码自动识别图形验证码
...{512104542,562436190},//'8'
自动识别图形验证码自动识别图形验证码
...{512104547,486805660}
自动识别图形验证码}
;//'9'
自动识别图形验证码
自动识别图形验证码
//字框高
自动识别图形验证码
privateintintCharHeight=10;
自动识别图形验证码
自动识别图形验证码
//字框横向间隙
自动识别图形验证码
privateintintCharSpaceH=5;
自动识别图形验证码
自动识别图形验证码
//字框纵向间隙
自动识别图形验证码
privateintintCharSpaceY=1;
自动识别图形验证码
自动识别图形验证码
//字框宽
自动识别图形验证码
privateintintCharWidth=5;
自动识别图形验证码
privateintIntImgHeight;
自动识别图形验证码
privateBufferedImageimg;
自动识别图形验证码
privateintintBgColor;
自动识别图形验证码
privateintintCharColor;
自动识别图形验证码
privateintintImgWith;
自动识别图形验证码
privateintintMaxX;
自动识别图形验证码
privateintintMaxY;
自动识别图形验证码
privateintintMinX;
自动识别图形验证码
privateintintMinY;
自动识别图形验证码
自动识别图形验证码
//座标原点
自动识别图形验证码
privatePointpOrigin;
自动识别图形验证码
privateStringstrNum;
自动识别图形验证码
自动识别图形验证码自动识别图形验证码
/***//**
自动识别图形验证码*Constructs...
自动识别图形验证码*
自动识别图形验证码*
自动识别图形验证码*
@paramimg
自动识别图形验证码*
自动识别图形验证码*
@throwsIOException
自动识别图形验证码
*/

自动识别图形验证码自动识别图形验证码
publicImgIdent(BufferedImageimg)throwsIOException...{
自动识别图形验证码
this.img=img;
自动识别图形验证码init();
自动识别图形验证码}

自动识别图形验证码
自动识别图形验证码自动识别图形验证码
/***//**
自动识别图形验证码*构造函数
自动识别图形验证码*
@paramfile本地文件
自动识别图形验证码*
@throwsIOException
自动识别图形验证码
*/

自动识别图形验证码自动识别图形验证码
publicImgIdent(Filefile)throwsIOException...{
自动识别图形验证码img
=ImageIO.read(file);
自动识别图形验证码init();
自动识别图形验证码}

自动识别图形验证码
自动识别图形验证码自动识别图形验证码
/***//**
自动识别图形验证码*构造函数
自动识别图形验证码*
@paramurl远程文件
自动识别图形验证码*
@throwsIOException
自动识别图形验证码
*/

自动识别图形验证码自动识别图形验证码
publicImgIdent(URLurl)throwsIOException...{
自动识别图形验证码img
=ImageIO.read(url);
自动识别图形验证码init();
自动识别图形验证码}

自动识别图形验证码
自动识别图形验证码自动识别图形验证码
/***//**
自动识别图形验证码*类初始工作
自动识别图形验证码
*/

自动识别图形验证码自动识别图形验证码
privatevoidinit()...{
自动识别图形验证码
自动识别图形验证码
//得到图象的长度和宽度
自动识别图形验证码
intImgWith=img.getWidth();
自动识别图形验证码IntImgHeight
=img.getHeight();
自动识别图形验证码
自动识别图形验证码
//得到图象的背景颜色
自动识别图形验证码
intBgColor=img.getRGB(7,4);
自动识别图形验证码
自动识别图形验证码
//System.out.println(intBgColor);
自动识别图形验证码
自动识别图形验证码
//初始化图象原点座标
自动识别图形验证码
pOrigin=newPoint(0,0);
自动识别图形验证码}

自动识别图形验证码
自动识别图形验证码自动识别图形验证码
/***//**
自动识别图形验证码*Methoddescription
自动识别图形验证码*
自动识别图形验证码
*/

自动识别图形验证码自动识别图形验证码
privatevoidgetBaseInfo()...{
自动识别图形验证码System.out.println(intBgColor
+"|"+intCharColor);
自动识别图形验证码System.out.println(intMinX
+"|"+intMinY+"|"+intMaxX+"|"+intMaxY);
自动识别图形验证码}

自动识别图形验证码
自动识别图形验证码自动识别图形验证码
/***//**
自动识别图形验证码*得到字符的左上右下点座标
自动识别图形验证码*
@paramintNoint第n个字符
自动识别图形验证码*
@returnint[]
自动识别图形验证码
*/

自动识别图形验证码自动识别图形验证码
privatePoint[]getCharRange(intintNo)...{
自动识别图形验证码
自动识别图形验证码
//左上右下点座标
自动识别图形验证码
PointpTopLeft=newPoint(0,0);
自动识别图形验证码PointpBottomRight
=newPoint(0,0);
自动识别图形验证码
自动识别图形验证码
//左上点
自动识别图形验证码
pTopLeft.x=pOrigin.x+intCharWidth*(intNo-1)+intCharSpaceH*(intNo-1);
自动识别图形验证码pTopLeft.y
=pOrigin.y;
自动识别图形验证码
自动识别图形验证码
//右下点
自动识别图形验证码
pBottomRight.x=1+pOrigin.x+intCharWidth*intNo+intCharSpaceH*(intNo-1)-1;
自动识别图形验证码pBottomRight.y
=pOrigin.y+intCharHeight-1;
自动识别图形验证码
自动识别图形验证码自动识别图形验证码
returnnewPoint[]...{pTopLeft,pBottomRight};
自动识别图形验证码}

自动识别图形验证码
自动识别图形验证码自动识别图形验证码
/***//**
自动识别图形验证码*与背景颜色比较返回相应的字符
自动识别图形验证码*
@paramxint横座标
自动识别图形验证码*
@paramyint纵座标
自动识别图形验证码*
@returnchar返回字符
自动识别图形验证码
*/

自动识别图形验证码自动识别图形验证码
privatechargetBit(intx,inty)...{
自动识别图形验证码
intintCurtColor;
自动识别图形验证码
自动识别图形验证码intCurtColor
=img.getRGB(x,y);
自动识别图形验证码
自动识别图形验证码
//System.out.println("["+x+","+y+"]"+intCurtColor+"=="+intBgColor+"==>"+(Math.abs(intCurtColor)>7308252));
自动识别图形验证码
//return(Math.abs(intCurtColor)>=5689325)
自动识别图形验证码
//?'0'
自动识别图形验证码
//:'1';
自动识别图形验证码
return(intCurtColor==intBgColor)
自动识别图形验证码
?'0'
自动识别图形验证码:
'1';
自动识别图形验证码
自动识别图形验证码
//56893256008535
自动识别图形验证码
}

自动识别图形验证码
自动识别图形验证码自动识别图形验证码
/***//**
自动识别图形验证码*得到第n个字符对应的字符串
自动识别图形验证码*
@paramintNoint第n个字符
自动识别图形验证码*
@returnString代表字符位的串
自动识别图形验证码
*/

自动识别图形验证码自动识别图形验证码
privateStringgetCharString(intintNo)...{
自动识别图形验证码
自动识别图形验证码
//本字符的左上右下点座标
自动识别图形验证码
Point[]p=getCharRange(intNo);
自动识别图形验证码PointpTopLeft
=p[0];
自动识别图形验证码PointpBottomRight
=p[1];
自动识别图形验证码
自动识别图形验证码
//换算边界值
自动识别图形验证码
intintX1,intY1,intX2,intY2;
自动识别图形验证码
自动识别图形验证码intX1
=pTopLeft.x;
自动识别图形验证码intY1
=pTopLeft.y;
自动识别图形验证码intX2
=pBottomRight.x;
自动识别图形验证码

相关文章: