程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> ASP.NET 2.0 制作彩色驗證碼

ASP.NET 2.0 制作彩色驗證碼

編輯:.NET實例教程

一、ASP.Net的驗證碼的作用
對於一個預防攻擊的web表單來講,驗證碼通常是一個常見的措施。因為如果對於一些public區域的頁面內容來講,譬如一個登錄表單,如果沒有必要的安全措施,很可能遭到模擬登錄的暴力破解攻擊,要麼輕易獲得特定賬戶的登錄信息,要麼給服務器增加了大量的負荷,影響正常的服務。解決的辦法,一般就是在登錄前給出一個隨機的信息(驗證碼),顯示在頁面上,讓用戶填寫,以確保用戶是通過web頁面來進行正常的登入,對於非法的非web途徑登錄者會看不到這個驗證碼從而拒絕其登錄。雖然這樣,往往很多攻擊者會截獲登錄web頁,從而也搜索出驗證碼,這樣,驗證保護措施也失去意義,一般情況下,我們可以通過將驗證信息作為圖像信息顯示在web上,這樣就既可以不阻礙合法用戶登錄,又使非法攻擊者無法通過Html搜索獲得驗證信息。這大抵上就是驗證碼的用途和意義了。

二、ASP.Net的驗證碼實現

一般傳統的驗證碼圖像一般采用一些CGI、ISAPI程序加上一些加密代碼來動態生成圖像,ASP大多采用COM組件實現,相當辛苦。

ASP.Net中欲實現動態驗證碼卻相當容易,實例解說

重點列出vIEwImg.ASPx,前台沒有任何代碼,在後台中需要添加以下代碼:
//導入所需要的包
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
//然後在Load事件中添加以下代碼
 protected void Page_Load(object sender, EventArgs e)
    {
        string chkCode = string.Empty;

        //顏色列表,用於驗證碼、噪線、噪點
        Color[] color ={ Color.Black, Color.Red, Color.Blue, Color.Green, Color.Orange,

Color.Brown, Color.DarkBlue };

        //字體列表,用於驗證碼
        string[] font ={ "Times New Roman", "MS Mincho", "Book Antiqua", "Gungsuh",

"PMingLiU", "Impact" };

        //驗證碼的字符集,去掉了一些容易混淆的字符
        char[] character ={ ''2'', ''3'', ''4'', ''5'', ''6'', ''8'', ''9'', ''A'', ''B'', ''C'', ''D'', ''E'',

''F'', ''G'', ''H'', ''J'', ''K'', ''L'', ''M'', ''N'', ''P'', ''R'', ''S'', ''T'', ''W'', ''X'', ''Y'' };

        Random rnd = new Random();

        //生成驗證碼字符串
        for (int i = 0; i < 4; i++)
        {
        

$False$

;    chkCode += character[rnd.Next(character.Length)];
        }

        //保存驗證碼的CookIE
        HttpCookie anycookie = new HttpCookie("validateCookIE");

        anycookIE.Values.Add("ChkCode", chkCode);

        HttpContext.Current.Response.Cookies["validateCookIE"].Values["ChkCode"] =

chkCode;

        Bitmap bmp = new Bitmap(150, 30);

        Graphics g = Graphics.FromImage(bmp);

        g.Clear(Color.White);

        //畫噪線
        for (int i = 0; i < 5; i++)
        {
            int x1 = rnd.Next(150);
            int y1 = rnd.Next(30);
            int x2 = rnd.Next(150);
            int y2 = rnd.Next(30);
            Color clr = color[rnd.Next(color.Length)];
            g.DrawLine(new Pen(clr), x1, y1, x2, y2);
        }

        //畫驗證碼字符串
        for (int i = 0; i < chkCode.Length; i++)
        {
            string fnt = font[rnd.Next(font.Length)];
            Font ft = new Font(fnt, 16);
            Color clr = color[rnd.Next(color.Length)];
            g.DrawString(chkCode[i].ToString(), ft, new SolidBrush(clr), (float)i * 20 +

20, (float)6);
        }

        //畫噪點
        for (int i = 0; i < 100; i++)
        {
            int x = rnd.Next(bmp.Width);
            int y = rnd.Next(bmp.Height);
            Color clr = color[rnd.Next(color.Length)];
            bmp.SetPixel(x, y, clr);
        }
        //清除該頁輸出緩存設置該頁無緩存
        Response.Buffer = true;

        Response.ExpiresAbsolute = System.DateTime.Now.AddMilliseconds(0);

        Response.Expires = 0;

        Response.CacheControl = "no-cache";

        Response.AppendHeader("Pragma", "No-Cache");

        //將驗證碼圖片寫入內存流,並將其以"image/Png" 格式輸出
        MemoryStream ms = new MemoryStream();

        try
        {
            bmp.Save(ms, ImageFormat.Png);
            Response.ClearContent();
            Response.ContentType = "image/Png";
            Response.BinaryWrite(ms.ToArray());
        }
        finally
        {
            //顯式釋放資源
            bmp.Dispose();
            g.Dispose();
        }
    }

添加完成後,該頁面就可以生成一個彩色驗證碼
在需要驗證的頁面只需要在代碼中加入<img src="vIEwImg.ASPx" />即可。
在驗證時可用Request.Cookies["validateCookIE"].Values["ChkCode"].ToString();獲取該值進行驗證。
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved