ASP.NET程序中實現校驗碼圖像生成

在Web系統中不少時候須要用到校驗碼,例如咱們常常遇到很多電子郵件、論壇的註冊過程須要咱們輸入校驗碼,這是爲了提升安全性。今天咱們就來說講如何生成校驗碼。本身站在別人肩膀下和你們分享一下了。安全

  使用ASP.NET來生成校驗碼圖像很方便,網上也有很多教程與文章有介紹,不過這是個是在vb.net下的,供你們參考一下了   首先咱們來看看,生成校驗碼的一種常見方式:dom

  1. 生成校驗碼的字符串函數

  2. 將該字符串輸出爲圖像字體

  具體步驟.net

  下面咱們就開始簡單的例子來介紹這個過程,首先打開VS.NET,新建一個Web Site,添加一個新的 Web Form,取名爲 VCode.aspx,在其代碼文件(VCode.aspx.vb)中添加一個函數generateVCode,此函數用於生成校驗碼的字符串,具體代碼以下:code

''' <summary> ''' 產生隨機數(包含字母與數字)用於校驗碼 ''' </summary> ''' <param name="CodeLength"></param> ''' <returns></returns> ''' <remarks></remarks> Private Function generateVCode(ByVal CodeLength As Integer) As String Dim VCode As String = String.Empty Dim randObj As New Random() Dim c As Integer = 63 For i As Byte = 1 To CodeLength c = randObj.Next(35) If c >= 10 Then c += 7 End If c += 48 VCode += Chr(c) Next Return VCode End Functionorm

  上面的的函數使用隨機數來表明須要產生的校驗碼,包含數字與大寫的字母。server

  接着咱們須要將上面生成的校驗碼字符串做爲圖像輸出。利用ASP.NET的強大圖像處理功能能夠很方便的實現這一點。可是考慮到直接將校驗碼生成圖像輸出,安全性太差,咱們須要作一些加強。這裏我介紹一種簡單的方法,就是爲校驗碼圖像增長背景,可使用現有的一些圖像做爲背景,也可使用ASP.NET 直接畫出背景。爲了講解的方便,這裏咱們介紹使用ASP.NET直接來畫出背景。教程

  首先,圖像上輸出文字以前,能夠隨即選擇一種畫筆的筆觸(HatchBrush),具體的代碼以下:事件

''' <summary> ''' 產生隨機的筆觸樣式(用於圖像的背景) ''' </summary> ''' <returns></returns> ''' <remarks></remarks> Private Function generateHatchStyle() As HatchStyle  Dim slist As New ArrayList  For Each style As HatchStyle In System.Enum.GetValues(GetType(HatchStyle))   slist.Add(style)  Next

 Dim randObj As New Random()  Dim index As Integer = randObj.Next(slist.Count - 1)

 Return CType(slist(index), HatchStyle) End Function

  如今校驗碼字符串已經產生,用於圖像背景的畫筆也有了,咱們就介紹具體的圖像輸出,使用函數GenerateVCodeImage來輸出圖像,

''' <summary> ''' 產生隨機數校驗碼圖像 ''' </summary> ''' <remarks></remarks> Private Function GenerateVCodeImage()

 Dim oBitmap As Bitmap = New Bitmap(90, 35)  Dim oGraphic As Graphics = Graphics.FromImage(oBitmap)  Dim foreColor As System.Drawing.Color  Dim backColor As System.Drawing.Color

 Dim sText As String = generateVCode(5) '獲取校驗碼字符串  Dim sFont As String = "Comic Sans MS" '設置本身喜歡的字體

 '前景、背景的顏色  foreColor = Color.FromArgb(220, 220, 220)  backColor = Color.FromArgb(190, 190, 190)    '設置用於背景的畫筆  Dim oBrush As New HatchBrush(CType(generateHatchStyle(), HatchStyle), foreColor, backColor)  '用於輸出校驗碼的畫筆  Dim oBrushWrite As New SolidBrush(Color.Gray)

 '生成的圖像矩形大小  oGraphic.FillRectangle(oBrush, 0, 0, 100, 50)  oGraphic.TextRenderingHint = TextRenderingHint.AntiAlias

 Dim oFont As New Font(sFont, 14)  Dim oPoint As New PointF(5.0F, 4.0F)

 oGraphic.DrawString(sText, oFont, oBrushWrite, oPoint)    Response.ContentType = "image/jpeg"  oBitmap.Save(Response.OutputStream, ImageFormat.Jpeg)  oBitmap.Dispose()

 Return sText End Function   上面介紹的都是幾個實現具體功能的函數,咱們還須要在VCode.aspx的Page Load事件裏面添加調用這些函數的代碼,具體以下:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load  Dim code As String = GenerateVCodeImage()  Session("VCode") = code End Sub

  如今來看看效果,刷新幾回比較一下,注意背景的不一樣:

  咱們已經可以生成校驗碼的圖像了,那麼如何使用呢?下面介紹一個簡單的例子說明如何使用這個VCode.aspx。

  在 VS.NET中,轉到Default.aspx頁面添加一個名爲:TextBox1的TextBox,在其右邊添加一個Button,ID設置爲 btnCheck,還要再添加一個用於顯示提示信息的Label,把它的ID設置爲lblMessage。最後是咱們的重點,添加一個Image控件,設置ImageUrl='VCode.aspx'。以上幾個步驟設置結束後的參考HTML以下: 這一步能夠忽略的

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> <asp:Button ID="btnCheck" runat="server" Text="Check It" />  <asp:Label ID="lblMessage" runat="server"></asp:Label><br /> <br /> <asp:Image ID="Image1" runat="server" Height="32px" Width="104px" ImageUrl='VCode.aspx' /> <br /> <br />

  固然,咱們還須要實現檢查用戶輸入校驗碼是否正確,並給出提示。具體代碼以下:

Protected Sub btnCheck_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnCheck.Click  Dim code As String = Session("VCODE")  If TextBox1.Text.Trim.ToUpper = code Then   lblMessage.Text = "校驗成功!"   lblMessage.ForeColor = Color.Blue  Else   lblMessage.Text = "您輸入的註冊碼錯誤!"

 lblMessage.ForeColor = Color.Red  End If  TextBox1.Text = "" End Sub   具體的效果以下:

  總 結

  上述的方法考慮到講述的方便,省略了一些細節。固然咱們能夠根據具體的應用對上述實現的方法進行一些改進,例如上面介紹的字符串生成函數會生成字符O與數字0,會對用戶形成混淆。對於這個問題,能夠在其循環過程當中添加以下代碼解決(不生成數字0, 固然也能夠選擇兩個都不生成):

Private Function generateVCode(ByVal CodeLength As Integer) As String  Dim VCode As String = String.Empty  Dim randObj As New Random()  Dim c As Integer = 63  For i As Byte = 1 To CodeLength   '是否顯示 數字:0, 由於數字0 與字母O 容易混淆   'While (c = 63)    ' c = randObj.Next(35)   'End While   c = randObj.Next(35)   If c >= 10 Then    c += 7   End If   c += 48   VCode += Chr(c)  Next

 Return VCode End Function

  咱們還能夠在生成圖像的過程當中,使用更加複雜的方法來加強安全性,經常使用的方法有:

  1.在上述圖像生成結束後,在圖像上添加隨機的雜點,或者是隨機的線條

  2.使用彩色的字體或者背景;

  3.使用預先準備的干擾性更強的背景;

  4.還能夠移動或者旋轉每一個字符的位置與角度;

  固然咱們也可使用漢字來作校驗碼,可是用戶恐怕很難接受吧,哈哈遇到校驗碼裏面的字竟然不認識的時候,說不定很抓狂~~。

相關文章
相關標籤/搜索