当前位置:   article > 正文

C# 生成图形验证码

C# 生成图形验证码

目录

应用场景

开发运行环境

设计

生成内容

生成图片 

实现

核心代码

调用示例

小结


应用场景

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

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

开发运行环境

操作系统: Windows Server 2019 DataCenter

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

开发工具:VS2019  C#

设计

生成内容

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

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

GenerateType 枚举说明:

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

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

其参数说明如下:

实现

核心代码

完整的代码如下:

  1. <%@ Page Language="C#" Debug="False" AspCompat="False"%>
  2. <script language="C#" runat="server">
  3. void Page_load(object Sander,EventArgs e)
  4. {
  5. string vnum=GenerateCheckCode(6,CosysJaneCommonAPI.Security.GenerateType.OnlyNumber);
  6. CreateCheckCodeImage(vnum);
  7. }
  8. public enum GenerateType
  9. {
  10. OnlyNumber,OnlyEnLetter,Mixed
  11. }
  12. public string GenerateCheckCode(int charCount,GenerateType generateType)
  13. {
  14. int number;
  15. char code;
  16. string checkCode = String.Empty;
  17. System.Random random = new Random();
  18. for (int i = 0; i < charCount; i++)
  19. {
  20. number = random.Next();
  21. if (number % 2 == 0)
  22. code = (char)(generateType == GenerateType.OnlyEnLetter ? 'A' : '0' + (char)(number % 10));
  23. else
  24. code = (char)(generateType==GenerateType.OnlyNumber?'0':'A' + (char)(number % 26));
  25. checkCode += code.ToString();
  26. }
  27. return checkCode;
  28. }
  29. public void CreateCheckCodeImage(string checkCode)
  30. {
  31. if (checkCode == null || checkCode.Trim() == String.Empty)
  32. return;
  33. System.Drawing.Bitmap image = new System.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length * 12.5)), 22);
  34. Graphics g = Graphics.FromImage(image);
  35. try
  36. {
  37. //生成随机生成器
  38. Random random = new Random();
  39. //清空图片背景色
  40. g.Clear(Color.BurlyWood);
  41. //画图片的背景噪音线
  42. for (int i = 0; i < 1; i++)
  43. {
  44. int x1 = random.Next(image.Width);
  45. int x2 = random.Next(image.Width);
  46. int y1 = random.Next(image.Height);
  47. int y2 = random.Next(image.Height);
  48. g.DrawLine(new Pen(Color.Blue), x1, y1, x2, y2);
  49. }
  50. Font font = new System.Drawing.Font("Arial", 12, (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic));
  51. 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);
  52. g.DrawString(checkCode, font, brush, 2, 2);
  53. //画图片的前景噪音点
  54. for (int i = 0; i < 20; i++)
  55. {
  56. int x = random.Next(image.Width);
  57. int y = random.Next(image.Height);
  58. image.SetPixel(x, y, Color.FromArgb(random.Next()));
  59. }
  60. //画图片的边框线
  61. g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 2, image.Height - 1);
  62. System.IO.MemoryStream ms = new System.IO.MemoryStream();
  63. image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
  64. Response.ClearContent();
  65. Response.ContentType = "image/Gif";
  66. Response.BinaryWrite(ms.ToArray());
  67. }
  68. finally
  69. {
  70. g.Dispose();
  71. image.Dispose();
  72. }
  73. }
  74. </script>
  75. <html>
  76. <body topmargin="0" leftmargin="0" rightmargin="0" bottommargin="0" >
  77. <form runat=server></form>
  78. </body>
  79. </html>
调用示例

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

  1. <html>
  2. <body topmargin="0" leftmargin="0" rightmargin="0" bottommargin="0" >
  3. <form runat=server>
  4. <asp:Image ID="image1" runat="server" ImageUrl="GCCI.aspx" />
  5. </form>
  6. </body>
  7. </html>

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

显示成功后如下图所示:

1、仅数字模式

2、仅字母模式 

3、字母数字混合模式 

小结

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

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

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

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

感谢您的阅读,希望本文能够对您有所帮助。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/633012
推荐阅读
相关标签
  

闽ICP备14008679号