数字验证码

网络经常有人利用机器人程序自动注册、登录、灌水从而对网站安全性构成了严重威胁。为了进一步保证安全性,越来越多的网站开始采用动态生成的图形码或附加码进行验证。验证码技术就是在服务器端,生成一个随机数,并保存在内存中,然后将随机数写入设计好的图片中,发送给浏览器,并以图片形式显示给最终的用户。通过使用验证码后,自动注册程序无法再轻易地注册和破坏。本实例实现的是绘制一个简单的纯数字验证码,并对绘制数字设置了随机彩色点。

以下就贴出主要的验证码页面的代码供需要的朋友们参考:

protected void Page_Load(object sender, EventArgs e)
{

HttpContext.Current.Session[
"CheckCode"]=RndNum(4);
checkCodes(HttpContext.Current.Session[
"CheckCode"].ToString());
}



/// <summary>
/// 生成随机的字母
/// </summary>
/// <param name="VcodeNum">生成字母的个数</param>
/// <returns>string</returns>
private string RndNum(int VcodeNum)
{
string Vchar = "0,1,2,3,4,5,6,7,8,9";
string[] VcArray = Vchar.Split(',');
string VNum = ""; //由于字符串很短,就不用StringBuilder了
int temp = -1; //记录上次随机数值,尽量避免生产几个一样的随机数
//采用一个简单的算法以保证生成随机数的不同
Random rand = new Random();
for (int i = 1; i < VcodeNum + 1; i++)
{
if (temp != -1)
{
rand
= new Random(i * temp * unchecked((int)DateTime.Now.Ticks));
}
int t = rand.Next(VcArray.Length);
if (temp != -1 && temp == t)
{
return RndNum(VcodeNum);
}
temp
= t;
VNum
+= VcArray[t];
}
return VNum;
}



/// <summary>
/// 生成验证图片
/// </summary>
/// <param name="checkCode">验证字符</param>
private void checkCodes(string checkCode)
{
int iwidth = (int)(checkCode.Length * 13);
System.Drawing.Bitmap image
= new System.Drawing.Bitmap(iwidth, 23);
Graphics g
= Graphics.FromImage(image);
g.Clear(Color.White);
//定义颜色
Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
//定义字体
string[] font = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };
Random rand
= new Random();
//随机输出噪点
for (int i = 0; i < 50; i++)
{
int x = rand.Next(image.Width);
int y = rand.Next(image.Height);
g.DrawRectangle(
new Pen(Color.LightGray, 0), x, y, 1, 1);
}

//输出不同字体和颜色的验证码字符
for (int i = 0; i < checkCode.Length; i++)
{
int cindex = rand.Next(7);
int findex = rand.Next(5);

Font f
= new System.Drawing.Font(font[findex], 10, System.Drawing.FontStyle.Bold);
Brush b
= new System.Drawing.SolidBrush(c[cindex]);
int ii = 4;
if ((i + 1) % 2 == 0)
{
ii
= 2;
}
g.DrawString(checkCode.Substring(i,
1), f, b, 3 + (i * 12), ii);
}
//画一个边框
g.DrawRectangle(new Pen(Color.Black, 0), 0, 0, image.Width - 1, image.Height - 1);
//输出到浏览器
System.IO.MemoryStream ms = new System.IO.MemoryStream();
image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
HttpContext.Current.Response.ClearContent();
//Response.ClearContent();
HttpContext.Current.Response.ContentType = "image/Jpeg";
HttpContext.Current.Response.BinaryWrite(ms.ToArray());
g.Dispose();
image.Dispose();
}
posted @ 2011-06-27 12:53  亿典通柄棋  阅读(597)  评论(0编辑  收藏  举报