揭开验证码的神秘面纱

来源:互联网 发布:同志网络剧国产2017 编辑:程序博客网 时间:2024/06/05 18:53

转载自:

http://blog.csdn.net/wwwwenhuan/article/details/7672167


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







那么怎样通过ASP.NET实现验证码呢?下面我为大家介绍一种非常简单的方法。

1、新建一个一般处理程序(名为Code.ashx)



2、在Code.ashx文件中输入以下内容(记住不是在Code.ashx.cs文件中

[csharp] view plaincopyprint?
  1. <%@ WebHandler Language="C#" Class="Code" %>  
  2.   
  3. using System;  
  4. using System.Web;  
  5. using System.Drawing;  
  6. using System.Drawing.Drawing2D;  
  7. using System.Web.SessionState;    
  8.   
  9. public class Code : IHttpHandler, IRequiresSessionState  // 要使用session必须实现该接口,记得要导入System.Web.SessionState命名空间  
  10. {  
  11.   
  12.     public void ProcessRequest(HttpContext context)  
  13.     {  
  14.         string checkCode = GenCode(5);  // 产生5位随机字符  
  15.         context.Session["Code"] = checkCode; //将字符串保存到Session中,以便需要时进行验证  
  16.         System.Drawing.Bitmap image = new System.Drawing.Bitmap(70, 22);  
  17.         Graphics g = Graphics.FromImage(image);  
  18.         try  
  19.         {  
  20.             //生成随机生成器  
  21.             Random random = new Random();  
  22.   
  23.             //清空图片背景色  
  24.             g.Clear(Color.White);  
  25.   
  26.             // 画图片的背景噪音线  
  27.             int i;  
  28.             for (i = 0; i < 25; i++)  
  29.             {  
  30.                 int x1 = random.Next(image.Width);  
  31.                 int x2 = random.Next(image.Width);  
  32.                 int y1 = random.Next(image.Height);  
  33.                 int y2 = random.Next(image.Height);  
  34.                 g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);  
  35.             }  
  36.   
  37.             Font font = new System.Drawing.Font("Arial", 12, (System.Drawing.FontStyle.Bold));  
  38.             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);  
  39.             g.DrawString(checkCode, font, brush, 2, 2);  
  40.   
  41.             //画图片的前景噪音点  
  42.             g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);  
  43.             System.IO.MemoryStream ms = new System.IO.MemoryStream();  
  44.             image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);  
  45.             context.Response.ClearContent();  
  46.             context.Response.ContentType = "image/Gif";  
  47.             context.Response.BinaryWrite(ms.ToArray());  
  48.         }  
  49.         finally  
  50.         {  
  51.             g.Dispose();  
  52.             image.Dispose();  
  53.         }  
  54.     }  
  55.   
  56.     /// <summary>  
  57.     /// 产生随机字符串  
  58.     /// </summary>  
  59.     /// <param name="num">随机出几个字符</param>  
  60.     /// <returns>随机出的字符串</returns>  
  61.     private string GenCode(int num)  
  62.     {  
  63.         string str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";  
  64.         char[] chastr = str.ToCharArray();  
  65.         // 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", "#", "$", "%", "&", "@" };  
  66.         string code = "";  
  67.         Random rd = new Random();  
  68.         int i;  
  69.         for (i = 0; i < num; i++)  
  70.         {  
  71.             //code += source[rd.Next(0, source.Length)];  
  72.             code += str.Substring(rd.Next(0, str.Length), 1);  
  73.         }  
  74.         return code;  
  75.   
  76.     }  
  77.   
  78.     public bool IsReusable  
  79.     {  
  80.         get  
  81.         {  
  82.             return false;  
  83.         }  
  84.     }  
  85.   
  86. }  

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


3、HTML通过<img>标签调用生成的验证码。
     在需要显示验证码的地方添加如下代码:

[html] view plaincopyprint?
  1. <img src="Code.ashx" ID="Cimg" alt=""/>  



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


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

这样即可实现单击验证码图片更换验证码了。


5、判断验证码是否输入正确(放在按钮(cmdSubmit)的单击事件里面)

[csharp] view plaincopyprint?
  1. protected void cmdSubmit_Click(object sender,EventArgs e)  
  2. {  
  3.     string code=txtCode.text.Trim().ToUpper();  //将用户输入的验证码去空格,转大写  
  4.     string rightCode=Session["Code"].ToString();  //获取正确的验证码  
  5.   
  6.      if(code==rightCode)  
  7.       {  
  8.             //此处代码为提交用户的数据  
  9.       }  
  10. }  




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



原创粉丝点击