標籤

more tags...

最新回覆

利用ASP.NET的泛型處理常式(Handler)產生圖片驗證碼,結合IRequiresSessionState將驗證碼儲存在session裡,透過session值來驗證

最近小舖有人提到圖片驗證碼的文章.....

一般在輸入表單裡加上圖片驗證碼是不錯的...可以防止一些攻擊....

一般圖片驗證碼都是寫在aspx裡,而且都是利用cookie儲存....

小弟用一個簡單的範例,,介紹如何將圖片驗碼碼寫在handle裡,,並且將驗證碼儲存在session裡....

此範例,包含cookie與session的用法..,驗證碼的程式是參考網路上別人寫好的code...c#範例


ValidateCode.ashx

001 <%@ WebHandler Language="C#" Class="ValidateCode" %>
002
003 <%@ WebHandler Language="C#" Class="ValidateCode" %>
004
005 using System;
006 using System.Web;
007 using System.Drawing;
008 using System.Web.SessionState;

009
010 public class ValidateCode : IHttpHandler, IRequiresSessionState
011 {
012
013     public void ProcessRequest(HttpContext context)
014     {
015         CreateCheckCodeImage(GenerateCheckCode(context), context);
016     }

017
018     private string GenerateCheckCode(HttpContext context)
019     {
020         int number;
021         char code;
022         string checkCode = String.Empty;
023
024         System.Random random = new Random();
025
026         for (int i = 0; i < 5; i++)
027         {
028             number = random.Next();
029
030             if (number % 2 == 0)
031                 code = (char)('0' + (char)(number % 10));
032             else
033                 code = (char)('A' + (char)(number % 26));
034
035             checkCode += code.ToString();
036         }

037
038         //儲存在cookie
039         context.Response.Cookies.Add(new HttpCookie("CheckCode", checkCode));
040
041         //儲存在session
042         context.Session["CheckCode"] = checkCode;
043
044         return checkCode;
045     }

046
047     private void CreateCheckCodeImage(string checkCode, HttpContext context)
048     {
049         if (checkCode == null || checkCode.Trim() == String.Empty)
050             return;
051
052         System.Drawing.Bitmap image = new System.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length * 12.5)), 22);
053         Graphics g = Graphics.FromImage(image);
054
055         try
056         {
057             //生成?机生成器
058             Random random = new Random();
059
060             //清空?片背景色
061             g.Clear(Color.White);
062
063             //??片的背景噪音?
064             for (int i = 0; i < 25; i++)
065             {
066                 int x1 = random.Next(image.Width);
067                 int x2 = random.Next(image.Width);
068                 int y1 = random.Next(image.Height);
069                 int y2 = random.Next(image.Height);
070
071                 g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
072             }

073
074             Font font = new System.Drawing.Font("Arial", 12, (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic));
075             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);
076             g.DrawString(checkCode, font, brush, 2, 2);
077
078             //??片的前景噪音?
079             for (int i = 0; i < 100; i++)
080             {
081                 int x = random.Next(image.Width);
082                 int y = random.Next(image.Height);
083
084                 image.SetPixel(x, y, Color.FromArgb(random.Next()));
085             }

086
087             //??片的?框?
088             g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);
089
090             System.IO.MemoryStream ms = new System.IO.MemoryStream();
091             image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
092             context.Response.ClearContent();
093             context.Response.ContentType = "image/Gif";
094             context.Response.BinaryWrite(ms.ToArray());
095         }

096         finally
097         {
098             g.Dispose();
099             image.Dispose();
100         }

101     }

102
103     public bool IsReusable
104     {
105         get
106         {
107             return false;
108         }

109     }

110
111 }

112


CheckCode.aspx

01 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="CheckCode.aspx.cs" Inherits="CheckCode" %>
02
03 <%@ Register Src="ValidateCode.ascx" TagName="ValidateCode" TagPrefix="uc1" %>
04 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
05 <html xmlns="http://www.w3.org/1999/xhtml">
06 <head id="Head1" runat="server">
07     <title>CheckCode</title>
08 </head>
09 <body>
10     <form id="form1" runat="server">
11         <div>
12             <asp:Image ID="Image1" runat="server" ImageUrl="ValidateCode.ashx" /><br />
13             <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
14             <br />
15             <asp:Button ID="Button1" runat="server" Text="CheckCode(cookie)" OnClick="Button1_Click" /><br />
16             <asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="CheckCode(Session)" /></div>
17     </form>
18 </body>
19 </html>
20


CheckCode.aspx.cs

01 using System;
02 using System.Data;
03 using System.Configuration;
04 using System.Collections;
05 using System.Web;
06 using System.Web.Security;
07 using System.Web.UI;
08 using System.Web.UI.WebControls;
09 using System.Web.UI.WebControls.WebParts;
10 using System.Web.UI.HtmlControls;

11
12 public partial class CheckCode : System.Web.UI.Page
13 {
14     protected void Page_Load(object sender, EventArgs e)
15     {
16
17     }

18     protected void Button1_Click(object sender, EventArgs e)
19     {
20         //利用cookie驗證
21         if (String.Compare(Request.Cookies["CheckCode"].Value, this.TextBox1.Text, true) == 0)
22         {
23             Response.Write("正確");
24         }

25         else
26         {
27             Response.Write("錯誤");
28         }

29     }

30     protected void Button2_Click(object sender, EventArgs e)
31     {
32         //利用session驗證
33         if (String.Compare(Session["CheckCode"].ToString(), this.TextBox1.Text, true) == 0)
34         {
35             Response.Write("正確");
36         }

37         else
38         {
39             Response.Write("錯誤");
40         }

41     }

42 }



執行結果:


參考網址:http://www.cnblogs.com/gwazy/archive/2005/04/18/139510.html

推到 Twitter!
推到 Plurk!


 

2008/3/16 23:42| 閱讀數 : 2032 | 1 人收藏 我要推薦 | 2 Comments | 文章分類 : ASP.NET 訂閱


回覆

# re: 利用ASP.NET的泛型處理常式(Handler)產生圖片驗證碼,結合IRequiresSessionState將驗證碼儲存在session裡,透過session值來驗證, Posted by McEvoy on 2009/4/23 上午 10:45  回覆

您好,第一個程式碼的檔名是ValidateCode.ashx,格式是泛型,可是CheckCode.aspx程式裡面卻是Register src="ValidateCode.ascx",造成無法運作,即使改成ValidateCode.ashx也會說沒有繼承自 'System.Web.UI.UserControl'。小弟是硬把ValidateCode.ashx的內容貼至Web使用者控制項,之後可以運作,可是這樣真的沒問題嗎@@

# re: 利用ASP.NET的泛型處理常式(Handler)產生圖片驗證碼,結合IRequiresSessionState將驗證碼儲存在session裡,透過session值來驗證, Posted by 坎尼 on 2009/10/22 下午 04:08  回覆

回樓上(雖然是半年前的回覆)
其實應該是不用註冊 ValidateCode.ascx 的 WebUserControl
我猜 puma 大大應該是測試完忘了拿掉

.ashx 寫完只要在頁面上用 &lt;img src='ValidateCode.ashx' /&gt; 即可顯示驗證圖片

另外小補充一下,有用 Session 記得要繼承 IRequiresSessionState 介面
小弟在這邊卡了一下...

發表回覆

標題: *
姓名: *
Email: (將不會被顯示)
Url:
回覆: *
登入後使用進階評論
Please add 3 and 1 and type the answer here:
F6 Team logo


用BloggerAds 替自已加薪

每月文章

文章分類

推薦討論區

推薦部落格