首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET 產生驗證碼圖片(Bitmap + Graphics 繪製雜訊與文字)完整類別

     編輯:ASP.NET 基礎

核心類別:ValidateCodeHandler.ashx

public class ValidateCodeHandler : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "image/jpeg";

        using (var img = new Bitmap(80, 25))
        using (var g = Graphics.FromImage(img))
        {
            // 1. 背景填白
            g.Clear(Color.White);

            // 2. 畫邊框(寬高 -1 避免被背景覆蓋)
            g.DrawRectangle(Pens.Black, 0, 0, img.Width - 1, img.Height - 1);

            // 3. 畫雜訊線
            DrawNoise(100, g, img);

            // 4. 產生 4 碼驗證碼並寫入 Session
            string code = GenerateCode(4);
            context.Session["ValidateCode"] = code;

            // 5. 畫驗證碼文字(刪除線字體增加辨識難度)
            g.DrawString(code,
                new Font("Arial", 14, FontStyle.Strikeout),
                Brushes.Black,
                new RectangleF(new Random().Next(20), new Random().Next(7), img.Width, img.Height));

            // 6. 輸出 JPEG
            img.Save(context.Response.OutputStream, ImageFormat.Jpeg);
        }
    }

    private static readonly Random _rnd = new Random();

    private void DrawNoise(int count, Graphics g, Image img)
    {
        for (int i = 0; i < count; i++)
        {
            int x = _rnd.Next(img.Width);
            int y = _rnd.Next(img.Height);
            g.DrawLine(Pens.Red, x, y, x + 2, y + 2);
        }
    }

    private string GenerateCode(int length)
    {
        const string chars = "ASF2345WE5R9F3HMBCZ455K"; // 排除 1/l/o/O 等易混淆字元
        char[] arr = chars.ToCharArray();
        var sb = new StringBuilder();
        for (int i = 0; i < length; i++)
            sb.Append(arr[_rnd.Next(arr.Length)]);
        return sb.ToString();
    }

    public bool IsReusable => false;
}

前端使用方式

<img id="imgCode" src="ValidateCodeHandler.ashx" alt="驗證碼" style="cursor:pointer;" />
<a href="javascript:void(0);" onclick="$('#imgCode').attr('src', 'ValidateCodeHandler.ashx?' + Math.random());">看不清?換一張</a>
<br />
<input type="text" id="txtCode" />
<asp:Button ID="btnSubmit" runat="server" Text="送出" OnClick="btnSubmit_Click" />

後端驗證

protected void btnSubmit_Click(object sender, EventArgs e)
{
    string userInput = txtCode.Text.Trim().ToUpper();
    string serverCode = Session["ValidateCode"]?.ToString()?.ToUpper();

    if (string.Equals(userInput, serverCode))
    {
        // 驗證通過
    }
    else
    {
        // 驗證失敗
    }
}

進階強化建議

  • 扭曲/波形效果:參考 TwistImage 正弦波位移演算法,大幅提升 OCR 識別難度。
  • 字體隨機化:準備多種字體陣列,每字隨機挑選字體、大小、顏色、旋轉角度。
  • 背景漸層/圖片:替換單色背景為漸層或雜訊圖片。
  • Session 改用分散式快取:Web Farm 環境下需共享驗證碼(Redis/Database)。

現代替代方案

若專案允許引入 NuGet 套件,推薦使用 Captcha.NET、SkiaSharp 繪製更美觀、更安全的驗證碼,或直接整合 Google reCAPTCHA v3 / hCaptcha 以行為分析取代圖形辨識,兼顧安全性與使用者體驗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved