ASP.NET C# 生成验证码的三种常见实现方式

雨后青山
雨后青山
发布时间:2026-10-13| 5人浏览过
原创

本文将介绍在 ASP.NET 环境下,如何使用 C# 和 System.Drawing 命名空间实现图形验证码功能。内容包含三种典型场景:纯数字、混合字符以及算术运算验证码的生成逻辑与完整代码实现。

结果与目标

在 Web 应用中保护注册或登录接口,防止自动化脚本暴力破解。通过动态生成不易被 OCR 识别的图片,并要求用户输入对应的数值或表达式结果,实现人机验证。

准备条件

1. 运行环境:Windows 操作系统(System.Drawing 依赖 GDI+)。 2. 命名空间:System.Web.UI.WebControls, System.Drawing, System.Drawing.Imaging, System.IO。 3. Web 控件:用于显示图片的 Image 或 ImageButton,以及用于输入文本的 TextBox。

真实操作顺序

第1步:生成并绘制纯数字验证码

目的:创建一个仅包含 4 位数字的随机字符串并将其渲染为图像文件流返回给浏览器。

操作:

  • 入口:新建一个 Web Forms 页面(如 CheckCode.aspx),或在后台代码中直接处理响应。
  • 逻辑:
    1. 实例化 Random 类生成 0-9 之间的整数。
    2. 构建长度为 4 的验证码字符串。
    3. 创建 Bitmap 对象设定画布大小。
    4. 使用 Graphics 对象绘制背景噪点线、前景噪点及验证码文字。
    5. 将图像保存至内存流,写入 HTTP 响应流。

关键代码 - 生成逻辑与绘制:

private string RndNum() {
 int number;
 char code;
 string checkCode = String.Empty;
 System.Random random = new Random();
 for (int i = 0; i < 4; i++) {
  number = random.Next();
  // 此处原文逻辑偶数为数字,奇数转为大写字母,虽名为“纯数字”实则含字母,实际建议统一逻辑
  if (number % 2 == 0)
   code = (char)('0' + (char)(number % 10));
  else
   code = (char)('A' + (char)(number % 26));
  checkCode += code.ToString();
 }
 // 存储验证码至 Cookie,便于后续校验
 Response.Cookies.Add(new HttpCookie("yzmcode", checkCode));
 return checkCode;
}

private void CreateCheckCodeImage(string checkCode) {
 if (checkCode == null || checkCode.Trim() == String.Empty)
  return;
 // 根据长度动态计算图片宽度
 System.Drawing.Bitmap image = new System.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length * 12.5)), 22);
 Graphics g = Graphics.FromImage(image);
 try {
  System.Drawing.Random random = new System.Drawing.Random();
  g.Clear(Color.White);
  
  // 绘制背景干扰线
  for (int i = 0; i < 25; i++) {
   int x1 = random.Next(image.Width);
   int y1 = random.Next(image.Height);
   int x2 = random.Next(image.Width);
   int y2 = random.Next(image.Height);
   g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
  }
  
  // 绘制验证码文字
  Font font = new System.Drawing.Font("Arial", 12, (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic));
  System.Drawing.Drawing2D.LinearGradientBrush brush = new 
   System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height),
   Color.Blue, Color.DarkRed, 1.2f, true);
  g.DrawString(checkCode, font, brush, 2, 2);
  
  // 绘制前景干扰点
  for (int i = 0; i < 100; i++) {
   int x = random.Next(image.Width);
   int y = random.Next(image.Height);
   image.SetPixel(x, y, Color.FromArgb(random.Next()));
  }
  
  // 绘制边框并输出图像
  g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
  System.IO.MemoryStream ms = new System.IO.MemoryStream();
  image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
  
  Response.ClearContent();
  Response.ContentType = "image/Gif";
  Response.BinaryWrite(ms.ToArray());
 } finally {
  g.Dispose();
  image.Dispose();
 }
}

前端调用与校验:

在 Page_Load 中触发图片生成:

protected void Page_Load(object sender, EventArgs e) {
 this.CreateCheckCodeImage(RndNum());
}

在提交按钮事件中比对输入值与 Cookie 中的值:

protected void Button1_Click(object sender, EventArgs e) {
 HttpCookie cookie = Request.Cookies["yzmcode"];
 // 忽略大小写比较
 if (cookie != null && String.Compare(cookie.Value, TextBox1.Text, true) != 0) {
  Response.Write("<script>alert('验证码错误!')</script>");
 } else {
  Response.Write("<script>alert('验证码正确!')</script>");
 }
}

第2步:生成数字与字母组合验证码

目的:增强验证码复杂度,混合生成 0-9 数字及 A-Z 字母。

操作:

  • 区别:主要修改随机字符生成的逻辑部分。上述第1步代码中的 RndNum 已包含此逻辑。
  • 存储:将验证码存入名为 CheckCode 的 Cookie 中。
private string GenerateCheckCode() {
 int number;
 char code;
 string checkCode = String.Empty;
 Random random = new Random();
 for (int i = 0; i < 4; i++) {
  number = random.Next();
  if (number % 2 == 0)
   code = (char)('0' + (char)(number % 10));
  else
   code = (char)('A' + (char)(number % 26));
  checkCode += code.ToString();
 }
 Response.Cookies.Add(new HttpCookie("CheckCode", checkCode));
 return checkCode;
}

第3步:生成四则运算式验证码

目的:提升安全性,要求用户计算简单的加减乘除结果并输入答案。

操作:

  • 逻辑:随机生成两个 0-9 的整数及运算符(+,-,*,/)。
  • 处理除法:确保除数不为 0,若遇 0 则强制设为 1 以免异常。
  • 存储:将计算结果存入 Session["Code"]。
private string GenerateCheckCode() {
 Random rd = new Random();
 int Results = 0;
 int Num1 = rd.Next(10);
 int Num2 = rd.Next(10);
 string Expressions = "";
 // 随机选择运算符:1:+, 2:-, 3:*, 4:/
 int F = (rd.Next(4) + 1);
 switch (F) {
  case 1: // 加法
   Results = Num1 + Num2;
   Expressions = Num1 + "+" + Num2;
   break;
  case 2: // 减法
   Results = Num1 - Num2;
   Expressions = Num1 + "-" + Num2;
   break;
  case 3: // 乘法
   Results = Num1 * Num2;
   Expressions = Num1 + "*" + Num2;
   break;
  case 4: // 除法
   if (Num2 > 0) {
    Results = Convert.ToInt16(Num1 / Num2);
    Expressions = Num1 + "/" + Num2;
   } else {
    Results = Num1;
    Expressions = Num1 + "/1";
   }
   break;
 }
 Session["Code"] = Results.ToString();
 return Expressions;
}

完成判断

1. 浏览器请求该页面时,能够显示包含干扰元素的清晰文字图片。 2. 用户在输入框填写对应值并点击提交后,后端能成功读取保存的验证码(Cookie 或 Session)并与输入值进行比对,给出正确或错误的反馈提示。

简要总结

以上便是关于 ASP.NET C# 生成验证码的详细内容,更多关于 ASP.NET 安全组件的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。