歐陽艷階 梁 銘
[摘 要] 圖片驗(yàn)證碼技術(shù)是防止網(wǎng)站遭受機(jī)器人自動批量注冊或登錄的一種重要方法。本文介紹了目前的圖片驗(yàn)證碼技術(shù)及其存在的主要問題,并提出了自己的改良措施。
[關(guān)鍵詞] C#; 驗(yàn)證碼; 隨機(jī); 前景噪音點(diǎn); 背景噪音線
[中圖分類號] TP311.1[文獻(xiàn)標(biāo)識碼] A[文章編號] 1008-4738(2009)06-0092-03
[收稿日期] 2009-09-04
[作者簡介] 歐陽艷階(1974- ),男,十堰職業(yè)技術(shù)學(xué)院信息與智能工程系講師,研究方向:軟件技術(shù)與網(wǎng)絡(luò)技術(shù);梁 銘(1973- ),男,十堰職業(yè)技術(shù)學(xué)院信息與智能工程系講師,研究方向:軟件技術(shù)與嵌入式系統(tǒng)。
1 圖片驗(yàn)證碼技術(shù)
在正常的網(wǎng)站注冊、登錄時(shí),一般都需要用戶輸入驗(yàn)證碼,這是防止非法用戶用特定程序不斷進(jìn)行登錄嘗試,暴力破解網(wǎng)站的一種有效方法。驗(yàn)證碼是現(xiàn)在大多數(shù)網(wǎng)站通行的安全機(jī)制,比如金融機(jī)構(gòu)、門戶網(wǎng)站等。
圖片驗(yàn)證碼機(jī)制是指根據(jù)一定的隨機(jī)數(shù)生成算法來產(chǎn)生的一串隨機(jī)數(shù)字或符號,并加入一些干擾像素,最終生成相應(yīng)的用于驗(yàn)證的圖片。只有當(dāng)用戶肉眼識別出其中的驗(yàn)證碼信息,并輸入表單提交網(wǎng)站驗(yàn)證,成功后才能使用該網(wǎng)站提供的某項(xiàng)特定功能。驗(yàn)證碼的主要用途是:防止非法用戶利用機(jī)器人自動批量注冊或登錄,提高網(wǎng)站的安全性。因?yàn)槿绻?wù)器不能有效驗(yàn)證并拒絕大批量機(jī)器人自動注冊或登錄,就會導(dǎo)致其系統(tǒng)資源的嚴(yán)重耗費(fèi),降低網(wǎng)站性能,甚至使程序崩潰。因此使用驗(yàn)證碼技術(shù)能有效阻擋大批量機(jī)器人自動注冊或登錄的攻擊。
1.1 驗(yàn)證碼使用現(xiàn)狀
驗(yàn)證碼技術(shù)由于技術(shù)簡單,易實(shí)施,傳輸數(shù)據(jù)小,因此被各網(wǎng)站特別是論壇性質(zhì)的網(wǎng)站廣泛使用來防止自動化程序(如論壇自動灌水機(jī))進(jìn)行大批量的惡意行為。此類自動化程序較為流行,所以,在國內(nèi)排名前100名的論壇中有超過60%的論壇在注冊、登錄或發(fā)帖部分采用驗(yàn)證碼技術(shù)[1]。驗(yàn)證碼的另一個(gè)主要應(yīng)用場所是電子郵件類網(wǎng)站,用來輔助預(yù)防和阻止垃圾郵件群發(fā)??傮w來說,國外在驗(yàn)證碼技術(shù)的應(yīng)用場所與應(yīng)用程度和國內(nèi)基本相似。
1.2 國內(nèi)外研究現(xiàn)狀
驗(yàn)證碼在互聯(lián)網(wǎng)中的使用已經(jīng)非常普遍,驗(yàn)證碼實(shí)際也成為了網(wǎng)站和網(wǎng)民交互的一個(gè)重要模式。鑒于此國內(nèi)外都有學(xué)者對驗(yàn)證碼的設(shè)計(jì)和識別進(jìn)行研究。目前的驗(yàn)證碼生成技術(shù)主要集中在圖像合成、圖像噪聲處理、圖像變形等方面。驗(yàn)證碼識別技術(shù)研究主要集中在兩個(gè)方面。一種是基于外部輪廓特征的數(shù)字驗(yàn)證碼識別方法,主要是在單個(gè)數(shù)字圖像的處理分析上進(jìn)行了相應(yīng)研究,對單個(gè)數(shù)字圖像外部輪廓上、下、左、右4個(gè)方向進(jìn)行特征計(jì)算來進(jìn)行識別。另外一種是基于加權(quán)模板匹配算法的形變數(shù)字驗(yàn)證碼識別系統(tǒng),運(yùn)用統(tǒng)計(jì)學(xué)方法,也可以達(dá)到較好效果[2]。
1.3 目前圖片驗(yàn)證碼技術(shù)存在的問題
在圖片格式方面,驗(yàn)證碼圖片分辨率都較低,圖高一般在20 像素左右,圖寬一般在50~100 像素之間。該特點(diǎn)有時(shí)會造成相鄰字符間距過窄從而難以區(qū)分。此外分辨率較小意味著待識別字符本身信息量不大,很容易被識別軟件所識別,從而失去阻止大批量機(jī)器人自動注冊或登錄的作用[1]。
2 驗(yàn)證碼技術(shù)的改進(jìn)思路
針對目前圖片驗(yàn)證碼技術(shù)存在的主要問題,本文提出了相應(yīng)的改進(jìn)思路。主要體現(xiàn)在在圖片內(nèi)容和算法兩方面。
2.1 在圖片內(nèi)容方面的主要改進(jìn)措施
(1)適當(dāng)設(shè)定噪聲點(diǎn),有效降低識別軟件識別的正確率。
(2)修改字庫,包括寬度、高度,將圖片內(nèi)容的變形幅度加大,增加軟件識別的難度。
2.2 在算法方面的主要改進(jìn)措施
(1)自由設(shè)定驗(yàn)證碼位數(shù)。
3 關(guān)鍵技術(shù)
3.1 圖片驗(yàn)證碼實(shí)現(xiàn)的總體思路[3]
為了使網(wǎng)頁代碼更清晰,本文采用兩個(gè)頁面來完成圖片驗(yàn)證碼技術(shù)的實(shí)現(xiàn)。分別是啟動頁面Default.aspx和圖片驗(yàn)證碼實(shí)現(xiàn)頁面ImagePage.aspx。首先在啟動頁面Default.aspx上添加一個(gè)ImageButton控件和一個(gè)Button控件。ImageButton用來顯示驗(yàn)證碼圖像,Button控件用來重新生成新的驗(yàn)證碼圖像(防止隨機(jī)顯示模糊),其名稱分別為ImageButton1和Button1。頁面Defaut.aspx的設(shè)計(jì)界面如圖1所示:
其實(shí)現(xiàn)步驟如下:
(1)隨機(jī)產(chǎn)生一個(gè)長度為N (N的值可以由程序設(shè)置)的驗(yàn)證碼字符串,該字符串可以包含數(shù)字、大寫字母、小寫字母等。
(2)創(chuàng)建一張空圖片,以用于顯示驗(yàn)證碼字符串。
(3) 將隨機(jī)產(chǎn)生的字符適當(dāng)變形。
(4) 在圖片上顯示“畫”碼字符串。用戶每次刷新時(shí)所創(chuàng)建的字符串是不相同的。
(5)清空圖片背景色。
3.2 在圖片“畫”字符的算法及思路[4]
字符與圖片是兩種不同格式的對象。如果讓字符在圖片上顯示,并能適當(dāng)變形,最后變成一張圖片,就能達(dá)到能讓肉眼識別而機(jī)器人不能自動獲取字符碼的目的,從而防止非法用戶用特定程序不斷進(jìn)行登錄嘗試,暴力破解網(wǎng)站。
本算法先生成一張空圖片,設(shè)置圖片的大小、顏色、字體等相關(guān)屬性,再使用圖像的DrawString方法將隨機(jī)算法產(chǎn)生的字符“畫”在圖片上,最后變成一張字符與圖像融為一體的完整圖片,在ImageButton對象中顯示。只要在網(wǎng)頁的適當(dāng)位置嵌入ImageButton對象,即可實(shí)現(xiàn)圖片驗(yàn)證碼功能。具體算法如下:
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);
//修改字庫,包括寬度、高度,將圖片內(nèi)容的變形幅度加大
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 隨機(jī)數(shù)生成思路及算法[5]
驗(yàn)證碼圖片的隨機(jī)數(shù)一般包括26個(gè)大寫英文字母、26個(gè)小寫英文字母及0~9十個(gè)數(shù)字共62個(gè)字符??梢圆捎妹杜e方式或用循環(huán)方式自動生成。本文采用枚舉方式生成。實(shí)際開發(fā)中一般采用4位或6位驗(yàn)證碼。具體算法如下:
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[] {','}); //將驗(yàn)證碼字符轉(zhuǎn)換為字符數(shù)組
string VNum="";
int temp=-1;
Random rand=new Random();//產(chǎn)生隨機(jī)數(shù)
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; } 當(dāng)然,如果讀者有興趣,還可以添加其他的效果,如字體旋轉(zhuǎn)角度、圖像噪聲效果等。但是注意一點(diǎn),網(wǎng)站驗(yàn)證碼的實(shí)現(xiàn)并不是越復(fù)雜越好,要在速度和安全上找到一個(gè)平衡點(diǎn)。 4 結(jié)語 本文給出了一種圖片驗(yàn)證碼的算法設(shè)計(jì)及實(shí)現(xiàn)方法,程序采用Visual C# 2008編寫,所有代碼均已運(yùn)行通過,該實(shí)現(xiàn)方法可同樣適用于其他高級語言。本文所闡述的方法主要用于網(wǎng)上登錄注冊方面,希望能對要了解這方面的相關(guān)人員有所幫助。 [參考文獻(xiàn)] [1]全球中文論壇100 強(qiáng)[EB/OL]. http://www.qihoo.com/forum/portal/topbbs/top100.htm. [2]潘大夫,汪 渤.一種基于外部輪廓的數(shù)字驗(yàn)證碼識別方法[J].微計(jì)算機(jī)信息, 2007(3):25. [3]丁士鋒. 精通C# 3.0與NET 3.5高級編程[M].北京:清華大學(xué)出版社,2009:582. [4]趙春江. C#數(shù)字圖像處理算法典型實(shí)例[M].北京:人民郵電出版社,2009:219. [5]李 佳. C#開發(fā)技術(shù)大全[M].北京: 清華大學(xué)出版社,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
湖北工業(yè)職業(yè)技術(shù)學(xué)院學(xué)報(bào)2009年6期