驗證碼是一個圖片,將字母、數字甚至漢字作為圖片的內容,這樣一張圖片中的內容用人眼很容易識別,而程式將無法識別。在進行資料庫操作之前(比如登入驗證、投票、發帖、回複、註冊等等)程式首先驗證用戶端提交的驗證碼是否與圖片中的內容相同,如果相同則進行資料庫操作,不同則提示驗證碼錯誤,不進行資料庫操作。這樣各種機器人程式就被拒之門外了!
驗證碼的內容必須儲存在伺服器端,一般我們可以將隨機產生的驗證碼的內容放入Session中,使用者提交的時候將提交的內容與Session中的驗證碼進行比較判斷。在產生驗證碼的頁面後台代碼可以寫為:
protected void Page_Load(object sender, EventArgs e)
{
string checkCode = CreateRandomCode(6);
Session["CheckCode"] = checkCode;
CreateImage(checkCode);
}
//產生codeCount位的校正碼
private string CreateRandomCode(int codeCount)
{
string allChar = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,W,X,Y,Z";
string[] allCharArray = allChar.Split(',');
string randomCode = "";
int temp = -1;
Random rand = new Random();
for (int i = 0; i < codeCount; i++)
{
if (temp != -1)
{
rand = new Random(i * temp * ((int)DateTime.Now.Ticks));
}
int t = rand.Next(35);
if (temp == t)
{
return CreateRandomCode(codeCount);
}
temp = t;
randomCode += allCharArray[t];
}
return randomCode;
}
//產生映像
private void CreateImage(string checkCode)
{
int iwidth = (int)(checkCode.Length * 11.5);
System.Drawing.Bitmap image = new System.Drawing.Bitmap(iwidth, 20);
Graphics g = Graphics.FromImage(image);
Font f = new System.Drawing.Font("Arial", 10, System.Drawing.FontStyle.Bold);
Brush b = new System.Drawing.SolidBrush(Color.White);
//g.FillRectangle(new System.Drawing.SolidBrush(Color.Blue),0,0,image.Width, image.Height);
g.Clear(Color.Blue);
g.DrawString(checkCode, f, b, 3, 3);
//Pen blackPen = new Pen(Color.Black, 0);
//Random rand = new Random();
//for (int i = 0; i < 5; i++)
//{
// int y = rand.Next(image.Height);
// g.DrawLine(blackPen, 0, y, image.Width, y);
//}
System.IO.MemoryStream ms = new System.IO.MemoryStream();
image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
Response.ClearContent();
Response.ContentType = "image/Jpeg";
Response.BinaryWrite(ms.ToArray());
g.Dispose();
image.Dispose();
}
用戶端可以這樣寫:
1、先拖一個Image控制項在網頁中,注意修改其ImageUrl屬性為伺服器的頁面。
2、拖動相應的控制項進入網頁,編輯按鈕事件:
protected void Button1_Click(object sender, EventArgs e)
{
if ((this.TextBox1.Text == "rocket5725") && (this.TextBox2.Text == "rocket5725") && (this.TextBox3.Text == Session["CheckCode"].ToString()))
{
Response.Redirect("http://www.sina.com.cn");
}
else
Response.Write("錯誤");
}