ASP.NET C# 生成验证码的三种常见实现方式
本文将介绍在 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),或在后台代码中直接处理响应。 - 逻辑:
- 实例化
Random类生成 0-9 之间的整数。 - 构建长度为 4 的验证码字符串。
- 创建
Bitmap对象设定画布大小。 - 使用
Graphics对象绘制背景噪点线、前景噪点及验证码文字。 - 将图像保存至内存流,写入 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 安全组件的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









