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

C# 生成驗證碼圖片的完整實現(含干擾線、扭曲、Session 存儲)

     編輯:PHP 相關知識

驗證碼是 Web 表單防刷的基礎組件。本文提供一個功能完整的 VerifyCode 類,支持自定義長度、字體、顏色、干擾點、正弦波扭曲,並可直接輸出圖片流到頁面,驗證碼值自動存入 Session。

核心類結構

public class VerifyCode
{
    // 配置屬性
    public int Length { get; set; } = 4;           // 驗證碼長度
    public int FontSize { get; set; } = 14;        // 字體大小
    public bool Chaos { get; set; } = true;        // 是否生成干擾點
    public Color ChaosColor { get; set; } = Color.LightGray;
    public Color BackgroundColor { get; set; } = Color.White;
    public int Padding { get; set; } = 2;          // 邊距
    public Color[] Colors { get; set; } = { ... }; // 字符顏色池
    public string[] Fonts { get; set; } = { "Arial", "Georgia" };
    public string CodeSerial { get; set; } = "0,1,2,...,Z"; // 字符集

    // 核心方法
    public string CreateVerifyCode(int codeLen = 0);      // 生成隨機碼
    public Bitmap CreateImageCode(string code);           // 繪製圖片
    public void CreateImageOnPage(string code, HttpContext context); // 輸出到 Response
    private Bitmap TwistImage(Bitmap src, bool bXDir, double dMultValue, double dPhase); // 正弦波扭曲
}

頁面調用示例

<%@ Page Language="C#" %>
<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        VerifyCode v = new VerifyCode();
        v.Length = 4;
        v.FontSize = 14;
        v.Chaos = true;
        v.BackgroundColor = Color.White;
        v.ChaosColor = Color.LightGray;
        v.Padding = 2;

        string code = v.CreateVerifyCode();      // 1. 生成隨機碼
        v.CreateImageOnPage(code, this.Context); // 2. 直接輸出圖片流 (Content-Type: image/Jpeg)
        Session["bao_code"] = code.ToUpper();    // 3. 存入 Session 供後續驗證
    }
</script>

前端使用

<img src="ValidateCode.aspx" id="captchaImg" style="cursor:pointer" title="點擊刷新" />
<input type="text" name="txtCode" />
<script>
    document.getElementById('captchaImg').onclick = function() {
        this.src = 'ValidateCode.aspx?' + Math.random(); // 防緩存刷新
    };
</script>

關鍵技術點解析

  1. 正弦波扭曲: TwistImage 方法對每個像素按正弦函數位移,生成波浪狀變形,有效對抗 OCR 識別。
  2. 干擾點: 隨機繪製單像素矩形,顏色可配置。
  3. 字符隨機化: 字體、顏色、垂直位移(上下錯位)均隨機,增加識別難度。
  4. 內存流輸出: 圖片保存到 MemoryStream,再 BinaryWrite 到 Response,無需生成臨時文件。
  5. 資源釋放: 及時 Dispose() Bitmap、Graphics、MemoryStream,防止內存洩漏。

安全性增強建議

  • 字符集剔除易混淆字符(如 0/O, 1/I/l, 8/B 等)。
  • 加入干擾線(DrawLine)、噪音圓圈。
  • 驗證碼存儲改用 Redis 分佈式 Session,支持集群部署。
  • 結合「點選文字」「滑動拼圖」等行為驗證,提升體驗與安全並重。

這個類結構清晰、可擴展性強,可直接集成到 ASP.NET WebForms 或 MVC 控制器中,是學習 GDI+ 繪圖與驗證碼原理的優秀案例。

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