验证码的作用:
验证码是用来防止暴破(暴力破解)的!
要知道如果防止,我们就要先知道暴力破解原理是什么!
暴力破解就是利用程序,在短时间内按照一定的规律,来输入用户名和密码,逐个的测试!
效果如:用户名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;
}
}
}
}