一聚教程网:一个值得你收藏的教程网站

热门教程

asp.net c# 彩色验证码图片生成程序

时间:2022-06-25 06:10:51 编辑:袖梨 来源:一聚教程网

彩色验证码图片可以防御别人的攻击?
因为当别人用轮询技术模拟登录的时候,他并不知道你的验证码是什么,也获取不到,因为这是一张图片,电脑并不能识别里面的数字是什么(除非破解验证码里面的干扰,再利用相关的图片识别技术有可能读出验证码,这里先不扯这个)。读不出验证码就没有机会轮询访问了,当然我们后台判断的时候一定要先判断验证码是否正确,以防止占用服务器资源。


3、随机数 code


 ①数字随机数

 

 1         ///
 2         /// 数字随机数
 3         ///

 4         ///
 5         private string getrndnum()
 6         {
 7             string code = string.empty;
 8             random random = new random();
 9             for (int i = 0; i < 4; i++)
10             {
11                 code = code + random.next(9).tostring();
12             }
13             return code;
14         }

②字符串随机数

 

 1         ///
 2         /// 字符串验证码
 3         ///

 4         ///
 5         private string getrndstr()
 6         {
 7             string vchar = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z";
 8             string[] vcarray = vchar.split(',');
 9             string checkcode = string.empty;
10             random rand = new random();
11             for (int i = 0; i < 4; i++)
12             {
13                 rand = new random(unchecked((int)datetime.now.ticks));//为了得到不同的随机序列
14                 int t = rand.next(vcarray.length);// the exclusive upper bound of the random number to be generated. maxvalue must be greater than or equal to zero,下标从0开始
15                 checkcode += vcarray[t];
16             }
17             return checkcode;
18         }

 
③中文随机数


 

1         ///
 2         /// 随机中文码
 3         ///

 4         ///
 5         private string getrndch()
 6         {
 7             system.text.encoding gb = system.text.encoding.default;//获取gb2312编码页(表)
 8             object[] bytes = createregioncode(4);//调用函数产生4个随机中文汉字编码
 9             string[] str = new string[4];
10             system.text.stringbuilder sb = new system.text.stringbuilder();
11             for (int i = 0; i < 4; i++)
12             {
13                 //根据汉字编码的字节数组解码出中文汉字
14                 str[i] = gb.getstring((byte[])convert.changetype(bytes[i], typeof(byte[])));
15                 sb.append( str[i].tostring());
16             }
17             return sb.tostring ();
18         }       
19
20
21         ///
22         /// 产生随机中文汉字编码
23         ///

24         ///
25         ///
26         private static object[] createregioncode(int strlength)
27         {
28             //定义一个字符串数组储存汉字编码的组成元素
29             string[] rbase = new string[16] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
30             random rnd = new random();
31             object[] bytes = new object[strlength];
32
33             for (int i = 0; i < strlength; i++)
34             {
35                 //区位码第1位
36                 int r1 = rnd.next(11, 14);
37                 string str_r1 = rbase[r1].trim();
38
39                 //区位码第2位
40                 rnd = new random(r1 * unchecked((int)datetime.now.ticks) + i);
41                 int r2;
42                 if (r1 == 13)
43                 {
44                     r2 = rnd.next(0, 7);
45                 }
46                 else
47                 {
48                     r2 = rnd.next(0, 16);
49                 }
50                 string str_r2 = rbase[r2].trim();
51
52                 //区位码第3位
53                 rnd = new random(r2 * unchecked((int)datetime.now.ticks) + i);//更换随机种子
54                 int r3 = rnd.next(10, 16);
55                 string str_r3 = rbase[r3].trim();
56
57                 //区位码第4位
58                 rnd = new random(r3 * unchecked((int)datetime.now.ticks) + i);
59                 int r4;
60                 if (r3 == 10)
61                 {
62                     r4 = rnd.next(1, 16);
63                 }
64                 else if (r3 == 15)
65                 {
66                     r4 = rnd.next(0, 15);
67                 }
68                 else
69                 {
70                     r4 = rnd.next(0, 16);
71                 }
72                 string str_r4 = rbase[r4].trim();
73
74                 //定义两个字节变量存储产生的随机汉字区位码
75                 byte byte1 = convert.tobyte(str_r1 + str_r2, 16);
76                 byte byte2 = convert.tobyte(str_r3 + str_r4, 16);
77
78                 //将两个字节变量存储在字节数组中
79                 byte[] str_r = new byte[] { byte1, byte2 };
80
81                 //将产生的一个汉字的字节数组放入object数组中
82                 bytes.setvalue(str_r, i);
83             }
84             return bytes;
85         }

 
4、现在有了素材(随机数),那么再加上图片和困扰就完成了彩色图片验证码--困扰背景+图片code


 

 1         ///
 2         /// 画图片的背景图,干扰
 3         ///

 4         ///
 5         ///
 6         private bitmap createimages(string checkcode,string type)
 7         {
 8             int step=0;
 9             if(type=="ch")
10             {
11                step=5;//中文字符比较大,所以字距要比较大
12             }
13             int iwidth = (int)(checkcode.length * (13 + stepw));
14             system.drawing.bitmap image = new system.drawing.bitmap(iwidth, 22);
15             graphics g = graphics.fromimage(image);
16
17             g.clear(color.white);//清除背景色
18
19             color[] c = { color.black, color.red, color.darkblue, color.green, color.orange, color.brown, color.darkcyan, color.purple };//定义随机颜色
20
21             string[] font = { "verdana", "microsoft sans serif", "comic sans ms", "arial", "宋体" };
22             random rand = new random();
23
24             for (int i = 0; i < 50; i++)
25             {
26                 int x1 = rand.next(image.width);
27                 int x2 = rand.next(image.width);
28                 int y1 = rand.next(image.height);
29                 int y2 = rand.next(image.height);
30                 g.drawline(new pen(color.lightgray,1), x1,y1,x2,y2);//根据坐标画线
31             }
32
33             for (int i = 0; i < checkcode.length; i++)
34             {
35                 int cindex = rand.next(7);
36                 int findex = rand.next(5);
37
38                 font f = new system.drawing.font(font[findex], 10, system.drawing.fontstyle.bold);
39                 brush b = new system.drawing.solidbrush(c[cindex]);
40                 int ii = 4;
41                 if ((i + 1) % 2 == 0)
42                 {
43                     ii = 2;
44                 }
45                 g.drawstring(checkcode.substring(i, 1), f, b, 3 + (i * (12 + stepw)), ii);
46             }
47
48             g.drawrectangle(new pen(color.black, 0), 0, 0, image.width - 1, image.height - 1);
49
50             system.io.memorystream ms = new system.io.memorystream();
51             return image;
52         }

5、总结


 根据你要的随机数和背景就可以返回bitmap数组,然后把bitmap数组以图片形式存到内存流,就可以返回了

热门栏目