现在的位置: 首页 > 综合 > 正文

揭开验证码的神秘面纱

2014年08月29日 ⁄ 综合 ⁄ 共 5608字 ⁄ 字号 评论关闭

验证码大家都很熟悉,那它是干什么的?百度百科里面是这么说的:验证码是区分用户是人还是计算机的公共全自动程序。其实这不难理解,大家看到的验证码都是图片格式的,计算机很难自动获取图片中的“混乱字符”(如果是文本格式的,计算机要获取就太容易了),只有人才能识别图片中的“混乱字符”,然后通过输入验证,才能进行下一步的操作。它的作用是:防止通过软件刷票、论坛灌水等,是一种既简单又实用的安全机制。







那么怎样通过ASP.NET实现验证码呢?下面我为大家介绍一种非常简单的方法。
1、新建一个一般处理程序(名为Code.ashx)
2、在Code.ashx文件中输入以下内容(记住不是在Code.ashx.cs文件中
  1. <%@ WebHandler Language="C#" Class="Code" %>
  2. using System;
  3. using System.Web;
  4. using System.Drawing;
  5. using System.Drawing.Drawing2D;
  6. using System.Web.SessionState;
  7. public class Code : IHttpHandler, IRequiresSessionState
    // 要使用session必须实现该接口,记得要导入System.Web.SessionState命名空间
  8. {
  9. public void ProcessRequest(HttpContext context)
  10. {
  11. string checkCode = GenCode(5);
    // 产生5位随机字符
  12. context.Session["Code"] = checkCode;
    //将字符串保存到Session中,以便需要时进行验证
  13. System.Drawing.Bitmap image = new System.Drawing.Bitmap(70, 22);
  14. Graphics g = Graphics.FromImage(image);
  15. try
  16. {
  17. //生成随机生成器
  18. Random random = new Random();
  19. //清空图片背景色
  20. g.Clear(Color.White);
  21. // 画图片的背景噪音线
  22. int i;
  23. for (i = 0; i < 25; i++)
  24. {
  25. int x1 = random.Next(image.Width);
  26. int x2 = random.Next(image.Width);
  27. int y1 = random.Next(image.Height);
  28. int y2 = random.Next(image.Height);
  29. g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
  30. }
  31. Font font = new System.Drawing.Font("Arial", 12, (System.Drawing.FontStyle.Bold));
  32. 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);
  33. g.DrawString(checkCode, font, brush, 2, 2);
  34. //画图片的前景噪音点
  35. g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
  36. System.IO.MemoryStream ms = new System.IO.MemoryStream();
  37. image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
  38. context.Response.ClearContent();
  39. context.Response.ContentType = "image/Gif";
  40. context.Response.BinaryWrite(ms.ToArray());
  41. }
  42. finally
  43. {
  44. g.Dispose();
  45. image.Dispose();
  46. }
  47. }
  48. /// <summary>
  49. /// 产生随机字符串
  50. /// </summary>
  51. /// <param name="num">随机出几个字符</param>
  52. /// <returns>随机出的字符串</returns>
  53. private string GenCode(int num)
  54. {
  55. string str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  56. char[] chastr = str.ToCharArray();
  57. // string[] source ={ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "#", "$", "%",
    "&", "@" };
  58. string code = "";
  59. Random rd = new Random();
  60. int i;
  61. for (i = 0; i < num; i++)
  62. {
  63. //code += source[rd.Next(0, source.Length)];
  64. code += str.Substring(rd.Next(0, str.Length), 1);
  65. }
  66. return code;
  67. }
  68. public bool IsReusable
  69. {
  70. get
  71. {
  72. return false;
  73. }
  74. }
  75. }


(以上是一个通过GDI绘图绘制验证码的程序段)

3、HTML通过<img>标签调用生成的验证码。
在需要显示验证码的地方添加如下代码:
  1. <img
    src="Code.ashx"
    ID="Cimg"
    alt=""/>

4、实现“看不清楚换一张”(通过JS实现),在头部添加如下脚本代码
  1. <script language="javascript" type="text/javascript">
  2. function ChangeCode()
  3. {
  4. var imgNode=document.getElementById("Cimg");
    //通过Id获取元素
  5. imgNode.src="Code.ashx?t=" + (new Date()).valueOf();
    //给img标签设置新的验证码
  6. }
  7. </script>

更改<img>标签的代码为:
  1. <img
    src="Code.ashx"
    ID="Cimg"
    alt=""
    onclick="ChangeCode()"/>

这样即可实现单击验证码图片更换验证码了。
5、判断验证码是否输入正确(放在按钮(cmdSubmit)的单击事件里面)
  1. protected void cmdSubmit_Click(object sender,EventArgs e)
  2. {
  3. string code=txtCode.text.Trim().ToUpper();
    //将用户输入的验证码去空格,转大写
  4. string rightCode=Session["Code"].ToString();
    //获取正确的验证码
  5. if(code==rightCode)
  6. {
  7. //此处代码为提交用户的数据
  8. }
  9. }

简单的5步,你就可以通过ASP.NET创建自己的验证码,并通过验证码进行验证了。
【上篇】
【下篇】

抱歉!评论已关闭.