ASP.NET Core 跨平台图形验证码实现

概述

几年前,大部分网站、论坛之类的是没有验证码的,因为对于一般用户来说验证码只是增加了用户的操作,降低了用户的体验。但是后来各种灌水机器人、投票机器人、恶意注册机器人层出不穷,大大增加了网站的负担同时也给网站数据库带来了大量的垃圾数据。为了防止各种机器人程序的破坏,于是程序员想出了只有人眼能够识别的,程序不容易识别的验证码!

验证码是一个图片,将字母、数字甚至汉字作为图片的内容,这样一张图片中的内容用人眼很容易识别,而程序将无法识别。在进行数据库操作之前(比如登录验证、投票、发帖、回复、注册等等)程序首先验证客户端提交的验证码是否与图片中的内容相同,如果相同则进行数据库操作,不同则提示验证码错误,不进行数据库操作。这样各种机器人程序就被拒之门外了!

验证码使用

验证码是针对各种机器人程序的,所以验证码图片中的内容是不能存放在Cookie、HTML和URL中的

代码实现

引用nuget包

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

44c0bb151d262437a112f7e3b0c0d467.png

创建VierificationCodeServices

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;namespace CompanyName.ProjectName.Core
{/// <summary>/// 验证码/// </summary>public class VierificationCodeServices{/// <summary>/// 该方法用于生成指定位数的随机数/// </summary>/// <param name="VcodeNum">参数是随机数的位数</param>/// <returns>返回一个随机数字符串</returns>private static string RndNum(int VcodeNum){//验证码可以显示的字符集合string Vchar = "0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,p" +",q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,P,P,Q" +",R,S,T,U,V,W,X,Y,Z";string[] VcArray = Vchar.Split(new Char[] { ',' });//拆分成数组string code = "";//产生的随机数int temp = -1;//记录上次随机数值,尽量避避免生产几个一样的随机数Random rand = new Random();//采用一个简单的算法以保证生成随机数的不同for (int i = 1; i < VcodeNum + 1; i++){if (temp != -1){rand = new Random(i * temp * unchecked((int)DateTime.Now.Ticks));//初始化随机类}int t = rand.Next(61);//获取随机数if (temp != -1 && temp == t){return RndNum(VcodeNum);//如果获取的随机数重复,则递归调用}temp = t;//把本次产生的随机数记录起来code += VcArray[t];//随机数的位数加一}return code;}/// <summary>/// 该方法是将生成的随机数写入图像文件/// </summary>/// <param name="code">code是一个随机数</param>/// <param name="numbers">生成位数(默认4位)</param>public static MemoryStream Create(out string code, int numbers = 4){code = RndNum(numbers);Bitmap Img = null;Graphics g = null;MemoryStream ms = null;Random random = new Random();//验证码颜色集合Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };//验证码字体集合string[] fonts = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋体" };//定义图像的大小,生成图像的实例Img = new Bitmap((int)code.Length * 18, 32);g = Graphics.FromImage(Img);//从Img对象生成新的Graphics对象g.Clear(Color.White);//背景设为白色//在随机位置画背景点for (int i = 0; i < 100; i++){int x = random.Next(Img.Width);int y = random.Next(Img.Height);g.DrawRectangle(new Pen(Color.LightGray, 0), x, y, 1, 1);}//验证码绘制在g中for (int i = 0; i < code.Length; i++){int cindex = random.Next(7);//随机颜色索引值int findex = random.Next(5);//随机字体索引值Font f = new Font(fonts[findex], 15, FontStyle.Bold);//字体Brush b = new SolidBrush(c[cindex]);//颜色int ii = 4;if ((i + 1) % 2 == 0)//控制验证码不在同一高度{ii = 2;}g.DrawString(code.Substring(i, 1), f, b, 3 + (i * 12), ii);//绘制一个验证字符}ms = new MemoryStream();//生成内存流对象Img.Save(ms, ImageFormat.Jpeg);//将此图像以Png图像文件的格式保存到流中//回收资源g.Dispose();Img.Dispose();return ms;}}
}

生成ValidateCode

/// <summary>/// 图形验证码/// </summary>/// <returns></returns>public IActionResult ValidateCode(){string code = "";MemoryStream ms = VierificationCodeServices.Create(out code);HttpContext.Session.SetString("LoginValidateCode", code);Response.Body.Dispose();return File(ms.ToArray(), @"image/png");}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295435.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

日常管理

2019独角兽企业重金招聘Python工程师标准>>> 关于目前自己iOS项目使用的第三方开源库 1.AFNetworking 目前比较推荐的iOS网络请求组件&#xff0c;默认网络请求是异步&#xff0c;通过block回调的方式对返回数据进行处理。 2.FMDB 对sqlite数据库操作进行了封装&…

Android之android studio如何把项目分享到github并提修改的代码到Github

android studio如何提交代码到Github 第一步、下载git 第二步:在android studio指定git路径 File->Settings 测试Git是否可用

清华伯克利造出机械小强:承重200万倍踩不死,跑得和真蟑螂一样快

全世界只有3.14 % 的人关注了爆炸吧知识打不死的小强&#xff0c;真的是太讨厌了&#xff01;既然打不死&#xff0c;那……干脆仿造一个出来&#xff0c;为我所用&#xff0c;岂不是爽歪歪&#xff1f;还真有人仿造成功了&#xff0c;最新的一期Science Robotics&#xff0c;就…

RowVersion字段从SqlServer到PostgreSQL的迁移

SQL Server 有个列是rowversion&#xff0c;之前是timestamp&#xff0c;因此这两个关键字在SQL server中是同义词&#xff0c;不过目前timestamp处在废弃阶段&#xff0c;因此我们最好使用rowversion来代替它。而在数据库迁移时&#xff0c;因为使用到该类型&#xff0c;因此要…

支付宝手机支付

1 在 "商家服务"开通"移动支付" 2 创建应用

zk 08之:Curator之一:zk客户端Curator

Curator是Netflix公司开源的一个Zookeeper客户端&#xff0c;与Zookeeper提供的原生客户端相比&#xff0c;Curator的抽象层次更高&#xff0c;简化了Zookeeper客户端编程。 它包含以下几个组件&#xff1a; ComponentdescriptionRecipesImplementations of some of the common…

Android之调用微信登陆、分享、支付

转载&#xff1a;http://blog.csdn.net/lowprofile_coding/article/details/48086381 前言:用了微信sdk各种痛苦,感觉比qq sdk调用麻烦多了,回调过于麻烦,还必须要在指定包名下的actvity进行回调,所以我在这里写一篇博客,有这个需求的朋友可以借鉴一下,以后自己别的项目有用到…

两年发表14篇论文,其中10篇一作,这是她的科研进阶攻略

全世界只有3.14 % 的人关注了爆炸吧知识本文来源&#xff1a;浙江大学两年发表14篇论文&#xff0c;其中一作10篇&#xff0c;包括4篇Top SCI&#xff0c;2篇SCI和4篇EI&#xff1b;持有2项发明专利&#xff0c;出版1部英文专著&#xff0c;斩获2020年度学生学术十大新成果奖第…

生活在任务栏的猫, CPU使用率越高它就跑的越快

生活在任务栏的猫, CPU使用率越高它就跑的越快Runcat 是一个桌面软件, 这只猫会显示在您的任务栏上面, 它会一直奔跑, 它的运行速度取决于CPU的使用率, 支持 Windows 和 Mac 平台。您还可以用它查看系统资源使用率, 包括CPU使用率,内存,电池状态,网络传输速度等。如果这只猫一直…

在Ant的javac中指定源文件编码方式,以避免警告: 编码 GBK 的不可映射字符的错误...

为什么80%的码农都做不了架构师&#xff1f;>>> * 该错误会造成源文件中的字符串出现混乱&#xff0c;从而影响indexOf()之类函数的正常功能&#xff0e; <javac srcdir"${common.src.dir}" destdir"${build.temp.common.classes.dir}" de…

现在要吃软饭的,都这么明目张胆了吗?

1 加我一个&#xff1f;▼2 为什么电梯里会有两只光着的右脚&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼这样&#xff1f;3 老爹的脸更黑了▼4 但也不影响吧&#xff1f;都不及格▼5 妈&#xff0c;你说的一点都没错&#xff01;&#xff08;素材来源网络&…

Android之app引导页(背景图片切换加各个页面动画效果)

转载&#xff1a;http://blog.csdn.net/lowprofile_coding/article/details/48037095 先看效果图: 1.显示三个页面的Activity 用view pager去加载三个fragment实现,控制点点点的切换,监听view pager的切换,控制fragment动画的开始跟结束,重写了view pager,实现了背景图片的移…

VSCode SSH 连接提示: spawn UNKNOWN

随笔记录 目录 1. 背景介绍 2. 确认问题 : ssh -V 3. 解决问题 3.1 确认本地 ssh.exe 路径 3.2 修改vscode Remote.ssh:Path 3.2.1 设置 Reomte.ssh:Path - 方法一 3.2.2 设置 Reomte.ssh:Path - 方法二 1. 背景介绍 windows 系统vscode ssh remote CentOS7&#xff…

手把手教你学Dapr - 9. 可观测性

介绍通过Tracing(跟踪)、Metrics(指标)、Logs(日志)和Health(运行状况)监控应用程序。分布式跟踪Dapr 使用 Zipkin 协议进行分布式跟踪 和 Metrics 收集。由于 Zipkin 协议的普遍性&#xff0c;许多后端都是开箱即用的&#xff0c;例如 Stackdriver、Zipkin、New Relic 等。结合…

这些魔术用的是物理原理?有啥诀窍?

全世界只有3.14 % 的人关注了爆炸吧知识许多成功的魔术&#xff0c;都运用了物理知识。我们在观看魔术表演时&#xff0c;也可以学到相当多的知识&#xff0c;有时用一般的原理就可以表演一个十分精彩的魔术。所以我们希望揭开魔术的神秘面纱&#xff0c;探究其中的物理知识。一…

安装Wamp时出现无法启动此程序,因为计算机中丢失MSVCR110.dll的解决方法

可能有的朋友在运行某软件时&#xff0c;会出现了“无法启动此程序,因为计算机中丢失 MSVCR110.dll。尝试重新安装该程序以解决此问题。”的提示,遇到这样的情况该怎么办呢&#xff1f;不用着急&#xff0c;下面小编就为大家带来解决方法&#xff0c;遇到同样问题却不知道如何解…

OAuth 2.0 扩展协议之 PKCE

前言阅读本文前需要了解 OAuth 2.0 授权协议的相关内容&#xff0c; 可以参考我的上一篇文章 OAuth 2.0 的探险之旅[1]。PKCE 全称是 Proof Key for Code Exchange&#xff0c; 在2015年发布&#xff0c; 它是 OAuth 2.0 核心的一个扩展协议&#xff0c; 所以可以和现有的授权模…

欧洲杯直播助PPTV日均流量登顶视频行业首位

随着意大利溃败&#xff0c;西班牙最终捧杯&#xff0c;四年一度火爆的欧洲杯赛事也就此落下帷幕。令人欣喜的是&#xff0c;在本届欧洲杯比赛的直播过程中&#xff0c;由于比赛安排再深夜&#xff0c;互联网应用取代传统电视台成为人们观看赛事的主要渠道&#xff0c;各大视频…

.NET 6新特性试用 | record struct

前言在以前的文章中&#xff0c;我们介绍过record类型&#xff0c;它具有不变性(《为什么应该用record来定义DTO》)和值相等性(《为什么应该用record来定义DTO&#xff08;续&#xff09;》)。record是引用类型。而在.NET 6中&#xff0c;我们可以使用record struct定义值类型。…

原来我们看到的世界地图竟这样震撼!多年的地理白学了...

▲ 点击查看几乎每个家庭都会有两张地图&#xff1a;一张世界地图&#xff0c;一张中国地图。薄薄的两张纸&#xff0c;蕴藏着让每个人学会“看世界”的磅礴力量。哈佛上一任校长&#xff0c;也是300多年来唯一一位女校长德鲁吉尔平福斯特&#xff08;Drew Gilpin Faust&#x…