当前位置: 代码网 > it编程>编程语言>C# > C#生成图形验证码的实现方式

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

2024年05月26日 C# 我要评论
应用场景我们当用户登录系统时经常会用到图形验证码技术,要求用户识别图片中的内容,并正确输入,方可尝试登录。类似的场景还有用户注册或者涉及频繁敏感操作的提交表单。因此,图形验证码是一个网络安全技术手段,

应用场景

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

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

开发运行环境

操作系统: 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#图形验证码的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com