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数据库操作进行了封装&…

关于input type=file 限制文件上传类型

HTML <input> 标签的 accept 属性 <input type"file" name"pic" id"pic" accept"image/gif, image/jpeg" />accept 的取值是 MIME_type列出素有MIME_type的取值&#xff1a;下列信息摘自w3cschool MIME 类型 MIME (Multip…

System Information for Windows

运行平台&#xff1a;Windows软件授权&#xff1a;自由软件软件大小&#xff1a;1.76MBSystem Information for Windows是一款功能非常强大的系统信息管理工具,除了可查看电脑中所有的软硬件信息,网络信息等这些基本功能外,还可以查看电脑中所有软件的注册信息,包括IE和 Firefo…

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 创建应用

java序列化有什么用_java中序列化的作用

一 什么叫序列化通俗点讲&#xff1a;它是处理对象流的一种机制&#xff0c;即可以很方便的保存内存中java对象的状态&#xff0c;同时也为了方便传输。二 序列化有什么作用1.方便传输&#xff0c;速度快&#xff0c;还很安全&#xff0c;被调用方序列化&#xff0c;调用方反序…

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

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

decimal,float和double的区别

一直很奇怪C#的预定义数据类型中为什么加了一个decimal&#xff0c;有float和double不就够了吗&#xff1f;今天来挖一挖。 浮点型 Name CTS Type De script ion Significant Figures Range (approximate) float System.Single 32-bit single-precision f…

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…

Oracle命令--alter 操作

1 alter database&#xff1a;修改数据文件 alter database datafile 4 offline; alter database datafile /opt/oracle/datafile/users01.dbf offline; alter database datafile /opt/oracle/datafile/users01.dbf resize 100M; alter database datafile /opt/oracle/datafile…

java 正则匹配引号_java 正则 贪婪匹配 匹配sql语句中的引号内容

public class Demo {public static void main(String[] args) {String sql1 "use test;select * from default.abc where dtabc;faf;fff and ct\"2012;43\" ; ";sql1 "select * from aaa where dt 20 ;12; 34;3 AND namefafae; fa ; a";//配置…

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

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 等。结合…