网站常用验证码讲解之一:绘制纯数字的网站验证码

用户注册或登录时,为了进一步保证安全性,越来越多的网站开始采用动态生成的图形码或附加码进行验证。验证码技术就是在服务器端,生成一个随机数,并保存在内存中,然后将随机数写入设计好的图片中,发送给浏览器,并以图片形显示给最终用户。

这里将实现的是数字验证码技术,即随机生成4位数字做为验证码。在开发绘制会员登录验证模块时使用数字验证码技术。

 

主要关键技术就是应用GDI+绘制验证码图片,并将其显示在验证图片中的数字绘制成彩色。在绘制验证码的同时,在画布中利用SetPixel方法绘制一些色点,以防止非法人员通过机器人软件进行强行登录。SetPixel方法的基本语法如下:

public void SetPixel(int x,int y,Color color)

参数说明:

x:要设置的像素的x坐标。

y:要设置的像素的y坐标。

color:它表示要分配给指定像素的颜色。

主要开发过程:

1)新建一个网站,将其命名为Number,将默认主页为Default.aspx更改成MumberValidate.aspx。然后再创建一个新的窗体将其命名为checkCode.aspx,用来实现纯数字验证码的生成。

2)在checkCode.aspx页面的Page_Load事件中,主要调用了编写的公共类CheckCode中的DrawImage()方法实现绘制彩色的数字验证码,在DrawImage()方法中生成验证图片的checkCodes()方法代码如下:

///

/// 生成验证图片 /// /// 验证字符 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); //声明Graphics对象 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(); HttpContext.Current.Response.ContentType = "image/Jpeg"; //设置输出流类型 HttpContext.Current.Response.BinaryWrite(ms.ToArray()); //写入输出流 g.Dispose(); //释放资源 image.Dispose(); //释放资源 }

注:稍后一段时间里将会继续讲解:

绘制数字与字母组合的验证码、

绘制中文彩色验证码

仿Google绘制数字、字母和中文扭曲验证码

在随机选中的图片上绘制混合验证码

智能语音提示验证码

简单的四则(加、减、乘和除)运算验证码

利用Web Server服务生成验证码

应用LINQ提取数据库中字段值绘制验证码

 

你可能感兴趣的:(ASP.NET网站安全与策略)