彩色驗證碼圖片(C#)

來源:互聯網
上載者:User

1、為什麼要加驗證碼?

因為加了驗證碼可以防禦別人攻擊你的網站,舉個例子:別人可以用webbrowser控制項做一個類比瀏覽器,並且類比提交表單(類比填寫表單資料和點擊提交按鈕),那麼你的伺服器必須接收這些表單傳過來的值,並且做判斷,是否正確。這樣一來,別人可以無限佔用你的伺服器資源,而且帳號密碼都不安全,萬一被別人搞個迴圈1個1個帳號輪詢的話,很有可能讓別人破解了你的資料資訊,所以安全性稍微高點的網站登入都有彩色圖片驗證碼。
2、為什麼彩色驗證碼圖片可以防禦別人的攻擊?

因為當別人用輪詢技術類比登入的時候,他並不知道你的驗證碼是什麼,也擷取不到,因為這是一張圖片,電腦並不能識別裡面的數字是什麼(除非破解驗證碼裡面的幹擾,再利用相關的圖片識別技術有可能讀出驗證碼,這裡先不扯這個)。讀不出驗證碼就沒有機會輪詢訪問了,當然我們後台判斷的時候一定要先判斷驗證碼是否正確,以防止佔用伺服器資源。

3、隨機數 Code

 ①數字隨機數

 
 1         /// <summary>
 2         /// 數字隨機數
 3         /// </summary>
 4         /// <returns></returns>
 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         /// <summary>
 2         /// 字串驗證碼
 3         /// </summary>
 4         /// <returns></returns>
 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         /// <summary>
 2         /// 隨機中文碼
 3         /// </summary>
 4         /// <returns></returns>
 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         /// <summary>
22         /// 產生隨機中文漢字編碼
23         /// </summary>
24         /// <param name="strlength"></param>
25         /// <returns></returns>
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         /// <summary>
 2         /// 畫圖片的背景圖,幹擾
 3         /// </summary>
 4         /// <param name="checkCode"></param>
 5         /// <returns></returns>
 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數組以圖片形式存到記憶體流,就可以返回了。在這裡只提供思路與製作方法並沒有提供全部代碼與封裝過程,若對代碼有疑問或者需要執行個體可以加QQ群128584255,大家討論學習一下。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.