C#验证码的简单实现

验证码的作用:
验证码是用来防止暴破(暴力破解)的!
要知道如果防止,我们就要先知道暴力破解原理是什么!
暴力破解就是利用程序,在短时间内按照一定的规律,来输入用户名和密码,逐个的测试!
效果如:用户名111 密码 111 ;用户名 222 密码 222 ;用户名 333 密码 333。。。。。。
比较容易破解用户名和密码简单的用户!
验证码在每一次刷新的过程中,就会更换为其他的数字,没有任何规律,如果没有填写验证码或验证
码不正确,系统也不用去和数据库中比对密码,直接返回,从而暴力破解无法进行。
验证码为什么既不是图片也不是数字?
道理很简单,如果是图片或是数字,通过查看源代码或者别的方法,可以获得验证码的信息,改进暴
力破解程序后,仍然可以进行暴力破解。验证码是根据程序随即生成的,是用程序计算出来的信息显
示在页面上。
数字型验证码
新建一个类用来创建验证码代码如下:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;
namespace UserCommon
{
    public class ValidateCode
    {
        //1.获取验证码
        public string CreateValidateCode(int length)
        {
            string validateCode = "";
            //int[] randMembers = new int[length];
            Random r = new Random();
            for (int i = 0; i < length; i++)
            {
                validateCode += r.Next(0, 9).ToString();
            }
            return validateCode;
        }
        //2.制作图片
        public void CreateValidateImg(string code, HttpContext context)
        {
            //定义图片
            Bitmap image = new Bitmap((int)Math.Ceiling(code.Length * 12.0), 22);
            Graphics graphics = Graphics.FromImage(image);
            //生成随机字体颜色
            try
            {
                Random r = new Random();
                graphics.Clear(Color.White);
                //绘制线条
                for (int i = 0; i < 10; i++)
                {
                    int x1 = r.Next(image.Width);
                    int x2 = r.Next(image.Width);
                    int y1 = r.Next(image.Height);
                    int y2 = r.Next(image.Height);
                    graphics.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
                }
                //绘制文本
                Font font = new Font("Arial", 12, (FontStyle.Bold | FontStyle.Italic));
                for (int i = 0; i < code.Length; i++)
                {
                    LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.FromArgb(r.Next(255), r.Next(255), r.Next(255)), Color.FromArgb(r.Next(255), r.Next(255), r.Next(255)), 0, true);
                    graphics.DrawString(code[i].ToString(), font, brush, 3 + i * 10, 2);
                }

                //绘制前景
                for (int i = 0; i < 120; i++)
                {
                    image.SetPixel(r.Next(image.Width), r.Next(image.Height), Color.FromArgb(r.Next(255), r.Next(255), r.Next(255)));
                }

                //将绘制的验证码图片保存为jpg,并写入到页面
                MemoryStream stream = new MemoryStream();
                image.Save(stream, ImageFormat.Jpeg);

                context.Response.Clear();
                context.Response.ContentType = "Image/jpeg";
                context.Response.BinaryWrite(stream.ToArray());
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                image.Dispose();
                graphics.Dispose();
            }
        }
    }
}

调用传入长度:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace ***
{
    /// <summary>
    /// ValidateImgCode 的摘要说明
    /// </summary>
    //一般处理程序中如果需要使用Session必须继承System.Web.SessionState.IRequiresSessionState标记接口
    public class ValidateImgCode : IHttpHandler,System.Web.SessionState.IRequiresSessionState
    {

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            UserCommon.ValidateCode validate = new UserCommon.ValidateCode();
            string code = validate.CreateValidateCode(4);
            context.Session["code"] = code;
            validate.CreateValidateImg(code, context);
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43434300/article/details/89603490