Mã nguồn ví dụ mẫu xác thực BotDetect ASP.NET 2.0 CAPTCHA - VB.NET

Ví dụ xác thực BotDetect ASP.NET CAPTCHA chứa mã cơ bản cần thiết để thêm CAPTCHA vào trang ASP.NET và xác thực câu trả lời của người dùng. Nó có thể dùng như điểm bắt đầu nếu đây là lần đầu tiên bạn học cách sử dụng BotDetect CAPTCHA, và nó tương đương với kết quả bạn đạt được nếu làm theo hướng dẫn Sử dụng BotDetect ASP.NET CAPTCHA trong Visual Studio 2005.

Vị trí dự án mẫu

Mặc định, dự án mẫu này được cài đặt tại
C:\Program Files\Lanapsoft\BotDetect\ASP.NET 2.0\v2.0\Samples\VBNetBotDetect2Demo\.

Bạn cũng có thể chạy nó từ Start Menu:
Programs > Lanapsoft > BotDetect > ASP.NET 2.0 > v2.0 > Samples > VB.NET BotDetect CAPTCHA Validation Sample.

Default.aspx

Mã nguồn đầy đủ

<%@ Page Language="VB" AutoEventWireup="false" 
  CodeFile="Default.aspx.vb" Inherits="_Default" %>

<%@ Register Assembly="Lanap.BotDetect" Namespace="Lanap.BotDetect" 
  TagPrefix="BotDetect" %>

<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>BotDetect Demo</title>
    <link type='text/css' rel='Stylesheet' href="StyleSheet.css" />
</head>
<body>
    <form id="form1" runat="server">
    <fieldset id="Preview">
        <legend>
            <span id="PreviewLegend">CAPTCHA Preview</span>
        </legend>
        <div id="PromptDiv">
            <span id="Prompt">Type the characters you see in 
              the picture</span>
        </div>
        <div id="CaptchaDiv">
            <BotDetect:Captcha ID="SampleCaptcha" runat="server" />
        </div>
        <div id="ValidationDiv">
            <asp:TextBox ID="CodeTextBox" runat="server">
            </asp:TextBox>
            <asp:Button ID="ValidateButton" runat="server" />
            <asp:Label ID="MessageCorrectLabel" runat="server">
            </asp:Label>
            <asp:Label ID="MessageIncorrectLabel" runat="server">
            </asp:Label>
        </div>
    </fieldset>
    <div id="Note">
        <span>NOTE: the Trial version will use "LANAP" instead of a 
          random code in 50% of renderings.</span>
    </div>
    </form>
</body>
</html>

Giải thích

Những dòng cần thiết để thêm BotDetect CAPTCHA vào trang ASP.NET và thực hiện việc xác thực sử dụng Ajax được tô đậm. Để sử dụng <BotDetect:Captcha>, trước hết chúng ta phải đăng ký Lanap.BotDetect.dll sử dụng <%@Register %>.

Trang web còn chứa <asp:TextBox> để người dùng nhập câu trả lời, một <asp:Button> để gửi câu trả lời, và một cặp <asp:Label> dùng để hiển thị kết quả xác thực.

.

Phần còn lại của file được sinh ra bởi Visual Studio 2005, hoặc dùng để định nghĩa cách thức sắp xếp và hiển thị của trang.

Default.aspx.vb

Mã nguồn đầy đủ

Partial Class _Default
    Inherits System.Web.UI.Page

    Protected Sub Page_PreRender(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.PreRender

        ' initial page setup
        If (Not IsPostBack) Then
            'set control text
            ValidateButton.Text = "Validate"
            MessageCorrectLabel.Text = "Correct!"
            MessageIncorrectLabel.Text = "Incorrect!"

            'these messages are shown only after validation
            MessageCorrectLabel.Visible = False
            MessageIncorrectLabel.Visible = False
        End If

		        ' clear user input on Reload button clicks
        Dim scriptTemplate As String
        scriptTemplate = "function LBD_ClearUserInput() {{" & _
          "  var LBD_textBox = document.getElementById('{0}');" & _
          "  if(LBD_textBox) {{" & _
          "    LBD_textBox.value = '';" & _
          "  }}" & _
          "}}" & _
          "LBD_RegisterHandler('PreReloadCaptchaImage', _
            LBD_ClearUserInput);"

        Dim script As String
        script = String.Format(scriptTemplate, CodeTextBox.ClientID)
        If (Not Page.ClientScript.IsStartupScriptRegistered( _
            "CaptchaReloadClearInput")) Then
          Page.ClientScript.RegisterStartupScript(Me.GetType(), _ 
            "CaptchaReloadClearInput", script, True)
        End If
				
        ' automatically lowercase user input
        CodeTextBox.Attributes.Add("onkeyup", _
            "this.value = this.value.toLowerCase();")

        If (IsPostBack) Then
            'validate the input code, and show 
            'the appropriate message 
            Dim code As String = CodeTextBox.Text.Trim().ToUpper()

            If (SampleCaptcha.Validate(code)) Then
                MessageCorrectLabel.Visible = True
                MessageIncorrectLabel.Visible = False
            Else
                MessageCorrectLabel.Visible = False
                MessageIncorrectLabel.Visible = True
            End If

            'clear previous user code input
            CodeTextBox.Text = ""
        End If

    End Sub

End Class

Giải thích

Việc xử lý trang được thực hiện trong phương thức xử lý sự kiện Page_PreRender, vì vậy tất cả các sự kiện được thực thi trước khi xác thực CAPTCHA. Nếu bạn muốn xác thực CAPTCHA trước một sự kiện nào đó, bạn có thể di chuyển đoạn mã xử lý vào phương thức Page_Load.

Hơn nữa, việc xử lý không được thực hiện trong phương thức ValidateButton_Click là có chủ đích, trong trường hợp có nhiều controls gửi trang – chúng ta muốn xác thực CAPTCHA cho dù vấn đề gì xảy ra. Hầu hết các bots sẽ không gửi trang bằng cách click vào nút, mà bằng cách dùng POST, có thể có hoặc không bao gồm "control gây nên postback", có nhiệm vụ phát động sự kiện click nút. Kiểm tra CAPTCHA trên từng trang đảm bảo tính bảo mật trong tất cả các trường hợp.

Lần đầu tiên tải trang ( if (!IsPostBack) ), nút và nhãn được khởi động, và việc xác thực được bỏ qua, vì người dùng chưa trả lời nó.

Mỗi lần trang được tải, chúng ta thêm một đoạn JavaScript nhỏ vào textbox hàm xử lý sự kiện phía máy khách onkeyup, vì vậy câu trả lời của người dùng ngay lập tức bị đổi thành chữ thường. Nó có mục đích để người sử dụng hiểu rằng CAPTCHA không phân biệt hoa hay thường.

Thêm nữa, chúng ta đăng ký một hàm xử lý sự kiện chạy trên máy khách PreReloadCaptchaImage để tự động xóa câu trả lời của người dùng mỗi lần tải lại trang. Vì khi nhấn nút Reload sẽ thay đổi ngẫu nhiên ký tự CAPTCHA, điều này giúp người dùng không phải xóa từng ký tự họ đã gõ vào trước khi thay đổi mã.

Khi trang được gửi ( if (IsPostBack) ), chúng ta gửi câu trả lời của người dùng vào phương thức Captcha.Validate(). Ở trong ví dụ này chúng ta dùng kết quả xác thực chỉ để hiển thị một thông báo, và luôn luôn hiển thị CAPTCHA mới. Trong hầu hết mọi trường hợp, bạn sẽ hiển thị CAPTCHA mới chỉ khi người dùng trả lời sai trước đó, và thực thi đoạn mã được bảo vệ (đăng nhập, comment...) nếu CAPTCHA được trả lời đúng.

Nếu bạn dẫn người dùng tới một trang khác khi xác thực thành công, và bạn muốn bảo vệ trang đó, có thể là ý hay khi dùng biến Session (ví dụ, Session["IsHuman"] = true), và kiểm tra trên các trang tiếp theo. Nếu không, bots có thể được viết để bỏ qua trang bảo vệ và truy cập trực tiếp vào trang được bảo vệ.

Cuối cùng, vì hình ảnh CAPTCHA được hiển thị mới mỗi lần trang được tải và mỗi mã CAPTCHA chỉ có thể được xác thực một lần (bất chấp kết quả xác thực), câu trả lời của người dùng phải được xoá sau khi xác thực.

Web.config

Mã nguồn đầy đủ

<?xml version="1.0"?>
<!-- 
    Note: As an alternative to hand editing this file you can use the 
    web admin tool to configure settings for your application. Use
    the Website->Asp.Net Configuration option in Visual Studio.
    A full list of settings and comments can be found in 
    machine.config.comments usually located in 
    \Windows\Microsoft.Net\Framework\v2.x\Config 
-->
<configuration>
  <connectionStrings/>
  <system.web>
    <httpHandlers>
      <add verb="*" path="LanapCaptcha.aspx" 
        type="Lanap.BotDetect.CaptchaHandler, Lanap.BotDetect"/>
    </httpHandlers>
    <sessionState mode="InProc" cookieless="AutoDetect" timeout="20" 
      sessionIDManagerType="Lanap.BotDetect.Persistence.
      CustomSessionIDManager, Lanap.BotDetect" />
    <!-- 
      Set compilation debug="true" to insert debugging 
      symbols into the compiled page. Because this 
      affects performance, set this value to true only 
      during development.
    -->
    <compilation debug="false">
      <assemblies>
        <add assembly="System.Design, Version=2.0.0.0, 
          Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
      </assemblies>
    </compilation>
    <pages>
      <namespaces>
        <clear/>
        <add namespace="System"/>
        <add namespace="System.Collections"/>
        <add namespace="System.Collections.Specialized"/>
        <add namespace="System.Configuration"/>
        <add namespace="System.Text"/>
        <add namespace="System.Text.RegularExpressions"/>
        <add namespace="System.Web"/>
        <add namespace="System.Web.Caching"/>
        <add namespace="System.Web.SessionState"/>
        <add namespace="System.Web.Security"/>
        <add namespace="System.Web.Profile"/>
        <add namespace="System.Web.UI"/>
        <add namespace="System.Web.UI.WebControls"/>
        <add namespace="System.Web.UI.WebControls.WebParts"/>
        <add namespace="System.Web.UI.HtmlControls"/>
      </namespaces>
    </pages>
    <!--
      The <authentication> section enables configuration 
      of the security authentication mode used by 
      ASP.NET to identify an incoming user. 
    -->
    <authentication mode="None"/>
    <!--
      The <customErrors> section enables configuration 
      of what to do if/when an unhandled error occurs 
      during the execution of a request. Specifically, 
      it enables developers to configure html error pages 
      to be displayed in place of a error stack trace.

      <customErrors mode="RemoteOnly" 
        defaultRedirect="GenericErrorPage.htm">
        <error statusCode="403" redirect="NoAccess.htm" />
        <error statusCode="404" redirect="FileNotFound.htm" />
      </customErrors>
    -->
  </system.web>
  <system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <handlers>
      <remove name="LanapCaptchaHandler" />
      <add name="LanapCaptchaHandler" preCondition="integratedMode" 
        verb="*" path="LanapCaptcha.aspx" 
        type="Lanap.BotDetect.CaptchaHandler, Lanap.BotDetect" />
    </handlers>
  </system.webServer>
</configuration>

Giải thích

Những dòng cần thiết để BotDetect CAPTCHA hoạt động đúng được tô đậm, các dòng khác đều được sinh ra bởi Visual Studio 2005.

Thành tố <httpHandlers> đăng ký đường dẫn sử dụng cho hình ảnh và âm thanh CAPTCHA được xử lý bởi mã trong Lanap.BotDetect.dll. Thành tố <system.webServer> được dùng cho cùng mục đích, nhưng chỉ được sử dụng chỉ cho IIS 7.0 được cấu hình để tích hợp ASP.NET trong tiến trình của IIS.

Khai báo validateIntegratedModeConfiguration="false" đảm bảo rằng file web.config có thể được xử lý bởi các phiên bản cũ hơn của IIS (5.1, 6.0) cũng như phiên bản 7.0. Vì cú pháp đăng ký HttpHandler khác nhau giữa các phiên bản IIS và chế độ tích hợp ASP.NET, dùng cả hai thành tố làm cho file web.config tương thích với tất cả các phiên bản IIS được hỗ trợ.

Thành tố <sessionState> khai báo cơ chế lưu trữ được sử dụng bởi BotDetect để lưu mã CAPTCHA và thiết lập cho mỗi người dùng. Thuộc tính Session State modes, providers, timeouts và cookieless attribute có thể được sử dụng, nhưng thành tố sessionIDManagerType được sử dụng để sửa lỗi gây bởi Windows Media Player 11 khi yêu cầu âm thanh CAPTCHAs (như được giải thích trong mục hỏi đáp).

Thành tố cookieless được thiết lập để cho phép trả lời CAPTCHAs cho dù người dùng có trình duyệt cấm cookies. Tuy nhiên, chú ý rằng cho những người dùng như vậy thì tất cả các Urls trong ứng dụng phải được viết lại để chứa Session ID, làm cho chúng động. Điều này có thế gây nên vấn đề với crawlers, mà không hỗ trợ cookies.

Một hệ quả của thiết lập này là Google và các bộ máy tìm kiếm khác có thể lưu nhiều bản sao của trang được bảo vệ bởi CAPTCHA trong chỉ mục (vì chúng luôn dẫn đến các url khác nhau). Nếu bạn muôn trang được bảo vệ bởi CAPTCHA được xác định bởi các bộ máy tìm kiếm, bạn phải dùng thiết lập cookieless="false", hoặc tìm cách để sử dụng cookieless Sessions cho người dùng là con người, nhưng không cho crawlers (thông qua User Agent, file App_Browsers .browser, ...)

Phiên bản hiện tại của BotDetect

Xin lưu ý

Trang này là bản dịch tiếng Việt không chính thức của trang gốc tiếng Anh: BotDetect ASP.NET 2.0 CAPTCHA Validation VB.NET Code Sample và có thể không chính xác, không đầy đủ hoặc không cập nhật.

Cập nhật ngày 2009-11-30. Áp dụng cho BotDetect ASP.NET CAPTCHA v2.0.15 và BotDetect ASP CAPTCHA v2.0.9.

language: English Español Tiếng Việt