C#生成图形验证码的实现方式

 更新时间:2024年04月28日 09:24:56   作者:初九之潜龙勿用  
我们当用户登录系统时经常会用到图形验证码技术,要求用户识别图片中的内容,并正确输入,方可尝试登录,因此,图形验证码是一个网络安全技术手段,图形验证码的呈现形式有很多种,这里我们将介绍最基本的生成方式,感兴趣的朋友可以参考下

应用场景

我们当用户登录系统时经常会用到图形验证码技术,要求用户识别图片中的内容,并正确输入,方可尝试登录。类似的场景还有用户注册或者涉及频繁敏感操作的提交表单。

因此,图形验证码是一个网络安全技术手段,防止恶意程序自动攻击执行。尽量能够避免非法用于访问和操作受保护的资源。图形验证码的呈现形式有很多种,这里我们将介绍最基本的生成方式,字母及数字的呈现方式。

开发运行环境

操作系统: Windows Server 2019 DataCenter

.net版本: .netFramework4.0 或以上

开发工具:VS2019  C#

设计

生成内容

GenerateCheckCode 方法用于生成验证码,本方法返回 string 类型字符串,其参数详见下表:

序号参数名类型说明
1charCountint要生成的字母或数字或组合的总计的字符数量
2generateTypeGenerateType生成类型枚举,详见枚举说明表

GenerateType 枚举说明:

序号枚举说明
1OnlyNumber仅生成数字内容
2OnlyEnLetter仅生成字母内容
3Mixed生成数字加字母的组合内容

生成图片 

CreateCheckCodeImage 方法根据传递生成的字符串生成最终的图片,图片数据为二进制输出。

其参数说明如下:

实现

核心代码

完整的代码如下:

<%@ Page Language="C#" Debug="False" AspCompat="False"%>
<script language="C#" runat="server">
void Page_load(object Sander,EventArgs e)
{
  string vnum=GenerateCheckCode(6,CosysJaneCommonAPI.Security.GenerateType.OnlyNumber);
  CreateCheckCodeImage(vnum);
}
public enum GenerateType
{
			OnlyNumber,OnlyEnLetter,Mixed
}
public string GenerateCheckCode(int charCount,GenerateType generateType)
{
	int number;
	char code;
	string checkCode = String.Empty;
 
	System.Random random = new Random();
 
	for (int i = 0; i < charCount; i++)
	{
		number = random.Next();
		if (number % 2 == 0)
			code = (char)(generateType == GenerateType.OnlyEnLetter ? 'A' : '0' + (char)(number % 10));
		else
			code = (char)(generateType==GenerateType.OnlyNumber?'0':'A' + (char)(number % 26));
 
			checkCode += code.ToString();
		}
		return checkCode;
}
 
public void CreateCheckCodeImage(string checkCode)
{
	if (checkCode == null || checkCode.Trim() == String.Empty)
		return;
 
	System.Drawing.Bitmap image = new System.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length * 12.5)), 22);
	Graphics g = Graphics.FromImage(image);
 
	try
	{
		//生成随机生成器 
		Random random = new Random();
 
		//清空图片背景色 
		g.Clear(Color.BurlyWood);
 
		//画图片的背景噪音线 
		for (int i = 0; i < 1; 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.Blue), 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(checkCode, font, brush, 2, 2);
 
		//画图片的前景噪音点 
		for (int i = 0; i < 20; 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 - 2, 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();
	}
}
 
</script>
<html>
<body topmargin="0" leftmargin="0" rightmargin="0" bottommargin="0" >
<form runat=server></form>
</body>
</html>

调用示例

我们假设在登录页面上放置 Image控件 image1,并将核心代码保存为 GCCI.aspx文件,则调用示例如下:

<html>
    <body topmargin="0" leftmargin="0" rightmargin="0" bottommargin="0" >
        <form runat=server>
            <asp:Image ID="image1" runat="server" ImageUrl="GCCI.aspx" />
        </form>
    </body>
</html>

通过给 image1 控件的 ImageUrl 赋值为GCCI.aspx文件即可。

显示成功后如下图所示:

1、仅数字模式

2、仅字母模式 

3、字母数字混合模式 

小结

本小结仅以生成图形验证码为参考,实际的应用中我们还需要考虑预生成验证码字符串,进行输入框文字对比操作。

生成验证码方法可以进一步改造生成符合我们需要的场景(如干扰线复杂度等)

还可考虑有效时效,过期需要重新刷新生成图形验证码,进一步提高安全性。

本示例 ImageUrl 属性传递的是固定URL,若要实现枚举,请按需要传递参数或其它设计。

以上就是C#生成图形验证码的实现方式的详细内容,更多关于C#图形验证码的资料请关注脚本之家其它相关文章!

相关文章

  • C#实现将Word转化分享为电子期刊

    C#实现将Word转化分享为电子期刊

    曾经由一个项目,要求实现制作电子期刊定期发送给企业进行阅读,由编辑人员使用 Microsoft Word先生成PDF文件,然后将生成的PDF文件转化为JPEG文件,最后将JPEG文件生成电子书模式,本文给大家介绍了C#实现将Word转化分享为电子期刊,需要的朋友可以参考下
    2023-12-12
  • 探讨:关闭浏览器后,php脚本会不会继续运行

    探讨:关闭浏览器后,php脚本会不会继续运行

    本篇文章是对关闭浏览器后,php脚本会不会继续运行进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • C#正则表达式匹配HTML中的图片路径,图片地址代码

    C#正则表达式匹配HTML中的图片路径,图片地址代码

    最近的项目中有个关于网页取图的功能需要我自己开发,那就是用正则表达式来匹配图片标签,这里简单介绍下实现方法,需要的朋友可以参考下
    2013-12-12
  • C#实现截图工具小项目

    C#实现截图工具小项目

    这篇文章主要为大家详细介绍了C#实现截图工具小项目,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • 关于async和await的一些误区实例详解

    关于async和await的一些误区实例详解

    这篇文章主要介绍了关于async和await的一些误区实例详解,有助于更加深入的理解C#程序设计,需要的朋友可以参考下
    2014-08-08
  • 基于WPF实现简单的下拉筛选控件

    基于WPF实现简单的下拉筛选控件

    这篇文章主要为大家详细介绍了如何基于WPF实现简单的下拉筛选控件,文中的示例代码讲解详细,对我们学习或工作有一定帮助,感兴趣的小伙伴可以了解一下
    2023-04-04
  • 解析错误富文本json字符串(带双引号)的快速解决方法

    解析错误富文本json字符串(带双引号)的快速解决方法

    下面小编就为大家带来一篇解析错误富文本json字符串(带双引号)的快速解决方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08
  • C# 实现连连看功能(推荐)

    C# 实现连连看功能(推荐)

    本文是利用C#实现连连看的小例子,使用线程thread实现后台运行时间控制,实现代码简单易懂,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-07-07
  • C#中的两种debug方法介绍

    C#中的两种debug方法介绍

    这篇文章主要介绍了C#中的两种debug方法介绍,本文讲解了代码用 #if DEBUG 包裹、利用宏定义两种方法,需要的朋友可以参考下
    2015-02-02
  • C#用户定义类型转换详解

    C#用户定义类型转换详解

    用于自定义类和结构能够进行隐式转换和显示转换.例如:将一个自定义类类型转换成整型,浮点型等,反之亦然
    2014-01-01

最新评论