欧阳艳阶 梁 铭
[摘 要] 图片验证码技术是防止网站遭受机器人自动批量注册或登录的一种重要方法。本文介绍了目前的图片验证码技术及其存在的主要问题,并提出了自己的改良措施。
[关键词] C#; 验证码; 随机; 前景噪音点; 背景噪音线
[中图分类号] TP311.1[文献标识码] A[文章编号] 1008-4738(2009)06-0092-03
[收稿日期] 2009-09-04
[作者简介] 欧阳艳阶(1974- ),男,十堰职业技术学院信息与智能工程系讲师,研究方向:软件技术与网络技术;梁 铭(1973- ),男,十堰职业技术学院信息与智能工程系讲师,研究方向:软件技术与嵌入式系统。
1 图片验证码技术
在正常的网站注册、登录时,一般都需要用户输入验证码,这是防止非法用户用特定程序不断进行登录尝试,暴力破解网站的一种有效方法。验证码是现在大多数网站通行的安全机制,比如金融机构、门户网站等。
图片验证码机制是指根据一定的随机数生成算法来产生的一串随机数字或符号,并加入一些干扰像素,最终生成相应的用于验证的图片。只有当用户肉眼识别出其中的验证码信息,并输入表单提交网站验证,成功后才能使用该网站提供的某项特定功能。验证码的主要用途是:防止非法用户利用机器人自动批量注册或登录,提高网站的安全性。因为如果服务器不能有效验证并拒绝大批量机器人自动注册或登录,就会导致其系统资源的严重耗费,降低网站性能,甚至使程序崩溃。因此使用验证码技术能有效阻挡大批量机器人自动注册或登录的攻击。
1.1 验证码使用现状
验证码技术由于技术简单,易实施,传输数据小,因此被各网站特别是论坛性质的网站广泛使用来防止自动化程序(如论坛自动灌水机)进行大批量的恶意行为。此类自动化程序较为流行,所以,在国内排名前100名的论坛中有超过60%的论坛在注册、登录或发帖部分采用验证码技术[1]。验证码的另一个主要应用场所是电子邮件类网站,用来辅助预防和阻止垃圾邮件群发。总体来说,国外在验证码技术的应用场所与应用程度和国内基本相似。
1.2 国内外研究现状
验证码在互联网中的使用已经非常普遍,验证码实际也成为了网站和网民交互的一个重要模式。鉴于此国内外都有学者对验证码的设计和识别进行研究。目前的验证码生成技术主要集中在图像合成、图像噪声处理、图像变形等方面。验证码识别技术研究主要集中在两个方面。一种是基于外部轮廓特征的数字验证码识别方法,主要是在单个数字图像的处理分析上进行了相应研究,对单个数字图像外部轮廓上、下、左、右4个方向进行特征计算来进行识别。另外一种是基于加权模板匹配算法的形变数字验证码识别系统,运用统计学方法,也可以达到较好效果[2]。
1.3 目前图片验证码技术存在的问题
在图片格式方面,验证码图片分辨率都较低,图高一般在20 像素左右,图宽一般在50~100 像素之间。该特点有时会造成相邻字符间距过窄从而难以区分。此外分辨率较小意味着待识别字符本身信息量不大,很容易被识别软件所识别,从而失去阻止大批量机器人自动注册或登录的作用[1]。
2 验证码技术的改进思路
针对目前图片验证码技术存在的主要问题,本文提出了相应的改进思路。主要体现在在图片内容和算法两方面。
2.1 在图片内容方面的主要改进措施
(1)适当设定噪声点,有效降低识别软件识别的正确率。
(2)修改字库,包括宽度、高度,将图片内容的变形幅度加大,增加软件识别的难度。
2.2 在算法方面的主要改进措施
(1)自由设定验证码位数。
3 关键技术
3.1 图片验证码实现的总体思路[3]
为了使网页代码更清晰,本文采用两个页面来完成图片验证码技术的实现。分别是启动页面Default.aspx和图片验证码实现页面ImagePage.aspx。首先在启动页面Default.aspx上添加一个ImageButton控件和一个Button控件。ImageButton用来显示验证码图像,Button控件用来重新生成新的验证码图像(防止随机显示模糊),其名称分别为ImageButton1和Button1。页面Defaut.aspx的设计界面如图1所示:
其实现步骤如下:
(1)随机产生一个长度为N (N的值可以由程序设置)的验证码字符串,该字符串可以包含数字、大写字母、小写字母等。
(2)创建一张空图片,以用于显示验证码字符串。
(3) 将随机产生的字符适当变形。
(4) 在图片上显示“画”码字符串。用户每次刷新时所创建的字符串是不相同的。
(5)清空图片背景色。
3.2 在图片“画”字符的算法及思路[4]
字符与图片是两种不同格式的对象。如果让字符在图片上显示,并能适当变形,最后变成一张图片,就能达到能让肉眼识别而机器人不能自动获取字符码的目的,从而防止非法用户用特定程序不断进行登录尝试,暴力破解网站。
本算法先生成一张空图片,设置图片的大小、颜色、字体等相关属性,再使用图像的DrawString方法将随机算法产生的字符“画”在图片上,最后变成一张字符与图像融为一体的完整图片,在ImageButton对象中显示。只要在网页的适当位置嵌入ImageButton对象,即可实现图片验证码功能。具体算法如下:
private void ValidateCode(string VNum)
{
Bitmap Img=null; //生成空图片
Graphics g=null; //生成空图像对象
MemoryStream ms=null;
int gheight=VNum.Length*12;
Img=new Bitmap(gheight,25);
g=Graphics.FromImage(Img);
//背景颜色
g.Clear(Color.White);
//文字字体
Font f=new Font("Arial Black",10);
//文字颜色
SolidBrush s=new SolidBrush(Color.Black);
g.DrawString(VNum,f,s,3,3);
//修改字库,包括宽度、高度,将图片内容的变形幅度加大
Font font = new Font("Arial", 15, FontStyle.Bold | FontStyle.Italic);
System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(
new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.Gray, 1.2f, true);
g.DrawString(code, font, brush, 0, 0);
ms=new MemoryStream();
Img.Save(ms,ImageFormat.Jpeg);
Response.ClearContent();
Response.ContentType="image/Jpeg";
Response.BinaryWrite(ms.ToArray());
g.Dispose();
Img.Dispose();
Response.End();
}
3.3 随机数生成思路及算法[5]
验证码图片的随机数一般包括26个大写英文字母、26个小写英文字母及0~9十个数字共62个字符。可以采用枚举方式或用循环方式自动生成。本文采用枚举方式生成。实际开发中一般采用4位或6位验证码。具体算法如下:
string Vchar="0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z";
string[] VcArray=Vchar.Split(new Char[] {','}); //将验证码字符转换为字符数组
string VNum="";
int temp=-1;
Random rand=new Random();//产生随机数
for(int i=1;i { if(temp!=-1) { rand=new Random(i*temp*unchecked((int)DateTime.Now.Ticks)); } int t=rand.Next(35); if(temp!=-1&&temp==t) { return RndNum(VcodeNum); } temp=t; VNum+=VcArray[t]; } return VNum; } 当然,如果读者有兴趣,还可以添加其他的效果,如字体旋转角度、图像噪声效果等。但是注意一点,网站验证码的实现并不是越复杂越好,要在速度和安全上找到一个平衡点。 4 结语 本文给出了一种图片验证码的算法设计及实现方法,程序采用Visual C# 2008编写,所有代码均已运行通过,该实现方法可同样适用于其他高级语言。本文所阐述的方法主要用于网上登录注册方面,希望能对要了解这方面的相关人员有所帮助。 [参考文献] [1]全球中文论坛100 强[EB/OL]. http://www.qihoo.com/forum/portal/topbbs/top100.htm. [2]潘大夫,汪 渤.一种基于外部轮廓的数字验证码识别方法[J].微计算机信息, 2007(3):25. [3]丁士锋. 精通C# 3.0与NET 3.5高级编程[M].北京:清华大学出版社,2009:582. [4]赵春江. C#数字图像处理算法典型实例[M].北京:人民邮电出版社,2009:219. [5]李 佳. C#开发技术大全[M].北京: 清华大学出版社,2009:840. Image Verification Code Technology and Its Improvement OUYANG Yan-Jie,LIANG Ming (Dept.of Information & Intelligence Eng., Shiyan Technical Institute, Shiyan 442000, China) Abstract:Image verification code technology is an important method to prevent the website from robot volume registration or log-in. This article discusses the current image verification code technology and its main problems, then puts forward its improvement approaches. Key words: C#; verification code; random; prospects for the noise points; background noise line