黑马程序员技术交流社区

标题: ASP.NET随机验证码 图文验证 (二) [打印本页]

作者: 穷傻呆丑萌    时间: 2013-7-31 00:34
标题: ASP.NET随机验证码 图文验证 (二)
好吧   前面发那个帖子图片都不能看。。抱歉了。。。。
现在又重新弄一次 发现 图片上传上去很模糊不是很清楚 ,也不知道为什么 。
然后放弃直接上图了  。。。打开环境,直接把代码复制过来了。。。。我想这样肯定就清楚了吧、、、、
结果字数超出范围了。。好吧  无比纠结
这个相对其上个帖子来说要好一点吧
大晚上的又重新弄了一次。。。如果版主看到  能不能考虑多给几个技术分。。。。。哈哈  先感谢一下
弄这个帖子。真心好累啊。。。。。不过学到了很多。。很有满足感 。。。哈哈。。。。别的不说。。直接上代码了。。。

还有 各位大神  看到了请多多指出不足或者错误的地方。。。供大家学习。。。。




随着人们对网络安全的日益重视,验证码技术的发展也越来越迅速,通常情况下,验证码有一下集中验证方式:
1.4为数字验证码,,这种严重法师通常是一组随机的数字字符串,4位数字验证码是最原始的验证码,验证原理比较简单,验证作用也不是很大,对网络黑客的安全防范作用也不是很强,因此在网站应用中也很少见。
2.GIF格式验证码,目前常用的的随机数字图片验证码,图片上的字符主要有文字和数字组成,紫檀没有太多的变化,验证作用比4为数字验证码要好一些,CSDN网站用户登录就是用GIF格式的验证码。
3.PNG格式验证码,这种验证方式验证码的图片用随机数字与随机大写英文字母组成,整个构图有点张扬,没刷新一次每个字符的位子还会变,偶时候刷新出的图片让人很难辨认,。使用PNG格式验证码比使用GIF验证格式更安全,QQ网站用户登录就是用PNG格式的验证码。
4.BMP格式验证码,这种验证方式的验证码有随机数字大写英文字母和随机干扰图素组成,BMP格式的验证码能够改变不同的随机位子,有时候还可以变换随机的字体。
5.JPG格式的验证码,这种验证码是有随机英文字母,随机颜色,随机位置和程度组成,Google的Gmail注册时使用的就是JPG格式的验证码。







接下来是相对难一点的图文验证。。。



using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Drawing;

public partial class ValidNums : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            string validateNum = CreateRandomNum(4);          //成生4位随机字符串
            CreateImage(validateNum);                         //将生成的随机字符串绘成图片
            Session["ValidNums"] = validateNum;               //保存验证码
        }
    }
    //生成随机字符串
    private string CreateRandomNum(int NumCount)
    {
        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 randomNum = "";
        int temp = -1;//记录上次随机数的数值,尽量避免产生几个相同的随机数
        Random rand = new Random();
        for (int i = 0; i < NumCount; i++)
        {
            if (temp != -1)
            {
                rand = new Random(i * temp * ((int)DateTime.Now.Ticks));
            }
            int t = rand.Next(35);
            if (temp == t)
            {
                return CreateRandomNum(NumCount);
            }
            temp = t;
            randomNum += allCharArray[t];
        }
        return randomNum;
    }
    //生成图片
    private void CreateImage(string validateNum)
    {
        if (validateNum == null || validateNum.Trim() == String.Empty)
            return;
        //生成Bitmap图像
        System.Drawing.Bitmap image = new System.Drawing.Bitmap(validateNum.Length * 12 + 10, 22);
        Graphics g = Graphics.FromImage(image);

        try
        {
            //生成随机生成器
            Random random = new Random();

            //清空图片背景色
            g.Clear(Color.White);

            //画图片的背景噪音线
            for (int i = 0; i < 25; i++)
            {
                int x1 = random.Next(image.Width);
                int x2 = random.Next(image.Width);
                int y1 = random.Next(image.Height);
                int y2 = random.Next(image.Height);

                g.DrawLine(new Pen(Color.Coral), x1, y1, x2, y2);
            }

            Font font = new System.Drawing.Font("Arial", 12, (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic));
            System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true);
            g.DrawString(validateNum, font, brush, 2, 2);

            //画图片的前景噪音点
            for (int i = 0; i < 100; i++)
            {
                int x = random.Next(image.Width);
                int y = random.Next(image.Height);
                image.SetPixel(x, y, Color.FromArgb(random.Next()));
            }

            //画图片的边框线
            g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);

            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            //将图像保存到指定的流
            image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
            Response.ClearContent();
            Response.ContentType = "image/Gif";
            Response.BinaryWrite(ms.ToArray());
        }
        finally
        {
            g.Dispose();
            image.Dispose();
        }
    }
}



protected void Button1_Click(object sender, EventArgs e)
    {
        string num = this.TextBox3.Text.Trim();
        string ValidNums = Session["ValidNums"].ToString();      //获得验证码
        if (Session["ValidNums"].ToString() == num.ToUpper())    //比较验证码
        {
            this.Page.RegisterStartupScript("ss", "<script>alert('恭喜您已经成功通过验证!')</script>");
        }
        else
        {
            this.Page.RegisterStartupScript("ss", "<script>alert('您输入的验证码不正确!')</script>");
        }
    }
}


















欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2