博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

生成验证码

Posted on 2008-10-27 18:23  Anna Yang  阅读(226)  评论(0编辑  收藏  举报
 验证码的作用:
验证码一般是防止有人利用机器人自动批量注册、对特定的注册用户用特定程序暴力破解方式进行不断的登陆、灌水。因为验证码是一个混合了数字或符号的图片,人眼看起来都费劲,机器识别起来就更困难。像百度贴吧未登录发贴要输入验证码大概是防止大规模匿名回帖的发生。 一般注册用户ID的地方以及各大论坛都要要输入验证码
 
普通验证码:(即没有图片的验证码) 
Code
 
当要在验证码中加入图片时:
/// <summary>
    
/// 生成验证图片
    
/// </summary>
    
/// <param name="checkCode">验证字符</param>
    public 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, 11);
        }

        
//输出不同字体和颜色的验证码字符
        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), 00, 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();
    }
 
对验证码的调用:
 public void DrawImage()
    {
        HttpContext.Current.Session[
"CheckCode"= RndNum(4);
        checkCodes(HttpContext.Current.Session[
"CheckCode"].ToString());           
    }