在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.還能夠移動或者旋轉每一個字符的位置與角度;
固然咱們也可使用漢字來作校驗碼,可是用戶恐怕很難接受吧,哈哈遇到校驗碼裏面的字竟然不認識的時候,說不定很抓狂~~。