一、ASP.Net的驗證碼的作用
對於一個預防攻擊的web表單來講,驗證碼通常是一個常見的措施。因為如果對於一些public區域的頁面內容來講,譬如一個登錄表單,如果沒有必要的安全措施,很可能遭到模擬登錄的暴力破解攻擊,要麼輕易獲得特定賬戶的登錄信息,要麼給服務器增加了大量的負荷,影響正常的服務。解決的辦法,一般就是在登錄前給出一個隨機的信息(驗證碼),顯示在頁面上,讓用戶填寫,以確保用戶是通過web頁面來進行正常的登入,對於非法的非web途徑登錄者會看不到這個驗證碼從而拒絕其登錄。雖然這樣,往往很多攻擊者會截獲登錄web頁,從而也搜索出驗證碼,這樣,驗證保護措施也失去意義,一般情況下,我們可以通過將驗證信息作為圖像信息顯示在web上,這樣就既可以不阻礙合法用戶登錄,又使非法攻擊者無法通過Html搜索獲得驗證信息。這大抵上就是驗證碼的用途和意義了。
二、ASP.Net的驗證碼實現
一般傳統的驗證碼圖像一般采用一些CGI、ISAPI程序加上一些加密代碼來動態生成圖像,ASP大多采用COM組件實現,相當辛苦。
ASP.Net中欲實現動態驗證碼卻相當容易,實例解說
重點列出vIEwImg.ASPx,前台沒有任何代碼,在後台中需要添加以下代碼:
//導入所需要的包
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
//然後在Load事件中添加以下代碼
protected void Page_Load(object sender, EventArgs e)
{
string chkCode = string.Empty;
//顏色列表,用於驗證碼、噪線、噪點
Color[] color ={ Color.Black, Color.Red, Color.Blue, Color.Green, Color.Orange,
Color.Brown, Color.DarkBlue };
//字體列表,用於驗證碼
string[] font ={ "Times New Roman", "MS Mincho", "Book Antiqua", "Gungsuh",
"PMingLiU", "Impact" };
//驗證碼的字符集,去掉了一些容易混淆的字符
char[] character ={ ''2'', ''3'', ''4'', ''5'', ''6'', ''8'', ''9'', ''A'', ''B'', ''C'', ''D'', ''E'',
''F'', ''G'', ''H'', ''J'', ''K'', ''L'', ''M'', ''N'', ''P'', ''R'', ''S'', ''T'', ''W'', ''X'', ''Y'' };
Random rnd = new Random();
//生成驗證碼字符串
for (int i = 0; i < 4; i++)
{
; chkCode += character[rnd.Next(character.Length)];
}
//保存驗證碼的CookIE
HttpCookie anycookie = new HttpCookie("validateCookIE");
anycookIE.Values.Add("ChkCode", chkCode);
HttpContext.Current.Response.Cookies["validateCookIE"].Values["ChkCode"] =
chkCode;
Bitmap bmp = new Bitmap(150, 30);
Graphics g = Graphics.FromImage(bmp);
g.Clear(Color.White);
//畫噪線
for (int i = 0; i < 5; i++)
{
int x1 = rnd.Next(150);
int y1 = rnd.Next(30);
int x2 = rnd.Next(150);
int y2 = rnd.Next(30);
Color clr = color[rnd.Next(color.Length)];
g.DrawLine(new Pen(clr), x1, y1, x2, y2);
}
//畫驗證碼字符串
for (int i = 0; i < chkCode.Length; i++)
{
string fnt = font[rnd.Next(font.Length)];
Font ft = new Font(fnt, 16);
Color clr = color[rnd.Next(color.Length)];
g.DrawString(chkCode[i].ToString(), ft, new SolidBrush(clr), (float)i * 20 +
20, (float)6);
}
//畫噪點
for (int i = 0; i < 100; i++)
{
int x = rnd.Next(bmp.Width);
int y = rnd.Next(bmp.Height);
Color clr = color[rnd.Next(color.Length)];
bmp.SetPixel(x, y, clr);
}
//清除該頁輸出緩存設置該頁無緩存
Response.Buffer = true;
Response.ExpiresAbsolute = System.DateTime.Now.AddMilliseconds(0);
Response.Expires = 0;
Response.CacheControl = "no-cache";
Response.AppendHeader("Pragma", "No-Cache");
//將驗證碼圖片寫入內存流,並將其以"image/Png" 格式輸出
MemoryStream ms = new MemoryStream();
try 添加完成後,該頁面就可以生成一個彩色驗證碼
{
bmp.Save(ms, ImageFormat.Png);
Response.ClearContent();
Response.ContentType = "image/Png";
Response.BinaryWrite(ms.ToArray());
}
finally
{
//顯式釋放資源
bmp.Dispose();
g.Dispose();
}
}
在需要驗證的頁面只需要在代碼中加入<img src="vIEwImg.ASPx" />即可。
在驗證時可用Request.Cookies["validateCookIE"].Values["ChkCode"].ToString();獲取該值進行驗證。