求知若饥,虚心若愚

ASP.NET 验证码 攻略,支持中文,字母,数字【转载】

验证码原理:

  • 图片生成:

首先创建一种Bitmap,然后给这张图片加背景色,加验证码,加噪音。其中主要是噪音点和噪音线。另外,字符串的变形处理也很关键,我弄得比较简单。

  • 随机验证码生成

先创建一个字符源数组(.net支持中文),该数组存放了验证码所需要得所有字符串。然后再利用随机数生成一个验证码字符串,并从字符源中取出字符放到验证码里。

关键点:字符源数组,你要考虑用户得容易识别性,比如字母得混淆如1和L,0和O。如果还要中文,应该挑选笔划少得,用户常识别得.输入法输入时按键少得。

  • 验证码得判断

可以使用cookie或者Session来保存,注意大小写。因为用户喜欢输入小写字母,而图片上大写字符比较好看.这就要注意大小写得转换。

代码:

gif.aspx 用来生成图像和保存到Cookie或者Session.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
//*************************
// 中英文验证码
// date:2006-12-25
// Program:greenerycn@163.com
//***************************
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Drawing;
using System.Drawing.Imaging;
///<summary>
/// 本页面生成随机图像验证码,生成gif图像.
///</summary>
 
publicpartialclass gif : System.Web.UI.Page
{
protectedvoid Page_Load(object sender, EventArgs e)
{
//字体大小
int font_size =14;
int width=0;
//使用纯数字做验证码
// string validate_str = Random_Number(4);
 
//使用数字加字母
string validate_str = Random_String(4);
 
width=validate_str.Length * (font_size +1);//计算宽度
 
//使用中文
// string validate_str = Random_Chinese(4);
 
//使用中文;加数字加字母
// string validate_str = Random_Chinese_Char(4);
// width = validate_str.Length * (font_size)*2 ;
 
//创建图像
Create_Validate_Image(validate_str,width,30,font_size);
 
//写入Cookie
//Response.Cookies.Add(new HttpCookie("ValidateCode",validate_str));
 
//写入Session
Session["key"] = validate_str;
}
///<summary>
/// 生成随机数字
///</summary>
///<param name="size">需要的数字个数</param>
///<returns>生成的字符串</returns>
privatestring Random_Number(int size)
{
int number;
char code;
string validate_str =string.Empty;
System.Random random =new Random();
for (int i =0; i < size; i++)
{
//返回一个指定范围内的随机数
number = random.Next(48,57); //48,57为ASCII码:0-9
code = (char)(number);
validate_str += code;
}
return validate_str;
}
///<summary>
///生成随机数字加字母
///</summary>
///<param name="validate_string_size">字符串长度</param>
///<returns>字符串</returns>
privatestring Random_String(int validate_string_size)
{
string vchar ="23456789ABCDEGHKMNPQRSUVWXYZ";
string vnum="";
System.Random rand=new Random();
for (int i =0; i <validate_string_size; i++)
{
int t = rand.Next(vchar.Length);
vnum += vchar[t];
}
return vnum;
}
///<summary>
/// 生成中文验证码字符串
///</summary>
///<param name="validate_string_size">字符个数</param>
///<returns>验证码字符串</returns>
privatestring Random_Chinese(int validate_string_size)
{
//string vchar = "2,3,4,5,6,7,8,9,a,b,c,d,e,g,h,k,m,n,p,q,r,s,u,v,w,x,y,z";
//这个字符源比较少,字也常用,适合五笔用户输入
string cchar ="我人有的和主产不为这工要在地一上是中国同经以发了民搜索就计算机业学习科技美女东西南北";
//这个 字符源比较多,字的笔划少,(输入法还没考虑),
//string cchar = "乙十丁厂七卜人九几儿了力乃刀又三于干亏士工土才寸下大丈与万上小口巾山千乞川亿个勺久凡及夕丸么广亡门义之尸弓己已子卫也女飞刃习叉马乡丰王井开夫天无元专云扎艺木五支厅不太犬区历尤友匹车巨牙屯比互切瓦止少日中冈贝内水见午牛手毛气升长仁什片仆化仇币仍仅斤爪反介父从今凶分乏公仓月氏勿欠风丹匀乌凤勾文六方火为斗忆订计户认心尺引丑巴孔队办以允予劝双书幻玉刊示末未击打巧正扑扒功扔去甘世古节本术可丙左厉右石布龙平灭轧东卡北占业旧帅归且旦目叶甲申叮电号田由史只央兄叼叫另叨叹四生失禾丘付仗代仙们仪白仔他斥瓜乎丛令用甩印乐句匆册犯外处冬鸟务包饥主市立闪兰半汁汇头汉宁穴它讨写让礼训必议讯记永司尼民出辽奶奴加召皮边发孕圣";
string vnum ="";
System.Random rand =new Random();
for (int i =0; i < validate_string_size; i++)
{
int t = rand.Next(cchar.Length);
vnum += cchar[t];
}
return vnum;
}
///<summary>
/// 生成中英文验证码字符串
///</summary>
///<param name="validate_string_size">字符个数</param>
///<returns>验证码字符串</returns>
privatestring Random_Chinese_Char(int validate_string_size)
{
string vchar ="23456789ABCDEGHKMNPQRSUVWXYZ我人有的和九主产不七为这工要十在地一上八是中国同经以四发了五民搜索就计六算机合肥业学习科技安徽美女东西南北二三";
string vnum ="";
System.Random rand =new Random();
for (int i =0; i < validate_string_size; i++)
{
int t = rand.Next(vchar.Length);
vnum += vchar[t];
}
return vnum;
}
///<summary>
/// 生成图像
///</summary>
///<param name="validate_str">随机字符串</param>
///<param name="width">图片宽度</param>
///<param name="height">图片高度</param>
///<param name="font_size">字体大小</param>
privatevoid Create_Validate_Image(string validate_str,int width,int height,int font_size)
{
if (validate_str ==null|| validate_str.Trim() == String.Empty)
return;
 
System.Drawing.Bitmap validate_image=new System.Drawing.Bitmap(width,height);
Graphics g=Graphics.FromImage(validate_image);
try
{
//生成随机生成器
Random random =new Random();
 
//清空图片背景色
g.Clear(Color.White);
 
//画图片的背景噪音线,15为噪音线条数
for (int i =0; i <15; i++)
{
int x1 = random.Next(validate_image.Width);
int x2 = random.Next(validate_image.Width);
int y1 = random.Next(validate_image.Height);
int y2 = random.Next(validate_image.Height);
g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
}
//画字符串
//文字字体
Font font =new System.Drawing.Font("Arial", font_size, (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic));
//文字颜色
//带渐变得效果
//System.Drawing.Drawing2D.LinearGradientBrush brush=new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0,0,validate_image.Width,validate_image.Height),Color.Blue,Color.Black,1.2f,true);
//普通单色
System.Drawing.SolidBrush brush =new System.Drawing.SolidBrush(Color.Green);
g.DrawString(validate_str,font,brush,2,(height/2-3*font_size/4));
//画图片的前景噪音点,50为噪音点数
for (int i =0; i <50; i++)
{
int x = random.Next(validate_image.Width);
int y = random.Next(validate_image.Height);
validate_image.SetPixel(x, y, Color.FromArgb(random.Next()));
}
//画图片的边框线
g.DrawRectangle(new Pen(Color.Silver),0,0,validate_image.Width-1,validate_image.Height-1);
System.IO.MemoryStream ms=new System.IO.MemoryStream();
validate_image.Save(ms,ImageFormat.Gif);
Response.ClearContent();
Response.ContentType="image/GIF";
Response.BinaryWrite(ms.ToArray());
}
finally
{
g.Dispose();
validate_image.Dispose();
}
}
 
 
}

 

test.aspx.其中有一个textbox.一个image,一个button

1
2
3
4
5
6
7
8
9
10
11
protectedvoid Button1_Click(object sender, EventArgs e)
{
//HttpCookieCollection cookies = Request.Cookies;
//string tmp = cookies["ImageV"].Value;
//然后比较tmp与获取的验证码文本框中的值是否相同
string validate_str = TextBox1.Text.ToString().ToUpper();
if (validate_str.Trim() == Session["key"].ToString())
{
Response.Write("<script >alert('验证成功');</script>");
}
}

 

posted @   初行  阅读(523)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述

点击右上角即可分享
微信分享提示