Hướng dẫn nâng cấp BotDetect ASP.NET CAPTCHA

Trang này hướng dẫn bạn các bước để nâng cấp BotDetect ASP.NET CAPTCHA lên phiên bản mới hơn.

Nâng cấp BotDetect ASP.NET CAPTCHA từ v2.0.14 lên v2.0.15

Phiên bản 2.0.15 của BotDetect ASP.NET CAPTCHA bao gồm một vài lỗi được vá, chỉ cần cập nhật file Lanap.BotDetect.dllLanap.BotDetect.Troubleshooting.dll trong dự án lên phiên bản mới hơn. Chi tiết các thay đổi trong lần phát hành này, xin hãy xem tại ghi chú khi phát hành v2.0.15.

Nâng cấp BotDetect ASP.NET CAPTCHA từ v2.0.13 lên v2.0.14

Phiên bản 2.0.14 của BotDetect ASP.NET CAPTCHA bao gồm một vài thay đổi đòi hỏi phải kiểm tra bên cạnh việc cập nhật Lanap.BotDetect.dll lên phiên bản mới. Chi tiết các thay đổi trong lần phát hành này, xin hãy xem tại ghi chú khi phát hành v2.0.14.

Nâng cấp chức năng Reload CAPTCHA

Khi bạn nâng cấp Lanap.BotDetect.dll trong dự án lên phiên bản mới hơn, nút Reload Captcha sẽ tự động khởi động sử dụng hoạt họa mới và độc lập với ngôn ngữ. Nếu bạn còn muốn nâng cao tính khả dụng của trang bằng cách xóa câu trả lời của người dùng khi nhấn nút Reload, bạn cần thêm đoạn mã sau vào hàm xử lý Page_PreRender của trang:

[C#]

// clear user input on Reload button clicks
string scriptTemplate = @"
  function LBD_ClearUserInput() {{
    var LBD_textBox = document.getElementById('{0}');
    if(LBD_textBox) {{
      LBD_textBox.value = '';
    }}
  }}
  LBD_RegisterHandler('PreReloadCaptchaImage', LBD_ClearUserInput);
";
string script = String.Format(scriptTemplate, CodeTextBox.ClientID);
if (!Page.ClientScript.IsStartupScriptRegistered(
    "CaptchaReloadClearInput"))
{
  Page.ClientScript.RegisterStartupScript(this.GetType(), 
    "CaptchaReloadClearInput", script, true);
}
[VB.NET]

' 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

Bạn cũng phải thay thế 'CodeTextBox' trong đoạn mã trên với ID của TextBox được sử dụng trên trang của bạn.

Lưu lỗi của CAPTCHA

Tiện ích tìm lỗi của BotDetect đã được cập nhật để xử lý việc lưu lỗi xác thực Captcha trong v2.0.14. Để sử dụng thay đổi này, HttpModule đã được đổi tên từ Lanap.BotDetect.Troubleshooting.LoggingModule thành Lanap.BotDetect.Troubleshooting.LoggingModule.

Khi nâng cấp, bên cạnh triển khai phiên bản mới của Lanap.BotDetect.Troubleshooting.dll (v1.0.14), bạn còn phải cập nhật file web.config, thay thế (<system.web>):

<add type="Lanap.BotDetect.Troubleshooting.LoggingModule, 
  Lanap.BotDetect.Troubleshooting" name="LoggingModule" />

với:

<add type="Lanap.BotDetect.Troubleshooting.LoggingModule, 
  Lanap.BotDetect.Troubleshooting" name="LoggingModule" />

và (<system.webServer>):

<remove name="LoggingModule"/>
<add name="LoggingModule" preCondition="integratedMode" 
  type="Lanap.BotDetect.Troubleshooting.LoggingModule, 
    Lanap.BotDetect.Troubleshooting"/>

với:

<remove name="LoggingModule"/>
<add name="LoggingModule" preCondition="integratedMode" 
  type="Lanap.BotDetect.Troubleshooting.LoggingModule, 
    Lanap.BotDetect.Troubleshooting"/>

Nếu bạn muốn biết cách dùng chức năng lưu lỗi mới này hãy xem Hướng dẫn lưu lỗi xác thực BotDetect ASP.NET 2.0 CAPTCHA.

Hiện thực ASP.NET MVC CAPTCHA

Để đơn giản hóa việc thêm xác thực Captcha vào ứng dụng ASP.NET MVC, v2.0.14 Mã nguồn ví dụ BotDetect ASP.NET MVC Captcha sử dụng ActionFilterAttribute.

Để nâng cấp ứng dụng ASP.NET MVC sử dụng phiên bản mới BotDetect Captcha v2.0.14:

  • Triển khai phiên bản mới của BotDetectLayout.cssBotDetectScript.js từ thư mục ví dụ mẫu Content
  • Thêm CaptchaValidationAttribute vào file mã nguồn (.cs hoặc .vb) từ Attributes trong thư mục ví dụ mẫu vào ứng dụng của bạn
  • Đánh dấu chức năng được bảo vệ bằng Captcha trong Controller với thuộc tính này, truyền Id của control câu trả lời của người dùng như là tham số thứ nhất, trong khi tham số thứ hai là giá trị của CaptchaId. Ví dụ, trong dự án mẫu chúng tôi đã thay đổi:

    [C#]
    
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Register(string userName, string email, 
      string password, string confirmPassword, string captchaCode)
    {
    [VB.NET]
    
    <AcceptVerbs(HttpVerbs.Post)> _
    Function Register(ByVal userName As String, ByVal email As String, _
      ByVal password As String, ByVal confirmPassword As String, _ 
      ByVal captchaCode As String) As ActionResult

    thành:

    [C#]
    
    [AcceptVerbs(HttpVerbs.Post)]
    [CaptchaValidation("captchaCode", "RegistrationCaptcha")]
    public ActionResult Register(string userName, string email, 
      string password, string confirmPassword, string captchaCode)
    {
    [VB.NET]
    		
    <AcceptVerbs(HttpVerbs.Post)> _
    <CaptchaValidation("captchaCode", "RegistrationCaptcha")> _
    Function Register(ByVal userName As String, ByVal email As String, _
      ByVal password As String, ByVal confirmPassword As String, _
      ByVal captchaCode As String) As ActionResult
  • Cập nhật phương thức xác thực Captcha trong Controller để sử dụng phương pháp xử lý mới dựa vào RouteData. Ví dụ, trong dự án mẫu chúng tôi đã thay đổi như sau:

    [C#]
    
    /// Captcha validation
    Lanap.BotDetect.MvcCaptcha captchaInstance = 
      new Lanap.BotDetect.MvcCaptcha("RegistrationCaptcha");
    	
    string captchaInstanceId = 
      Request.Form[captchaInstance.CaptchaIdKey];
    
    // the Captcha is only validated if it was included on the page
    if (!(String.IsNullOrEmpty(captchaInstanceId)))
    {
      if (!(captchaInstance.Validate(captchaCode, captchaInstanceId)))
      {
        ModelState.AddModelError("captchaCode", 
          "The CAPTCHA code was incorrect!");
      }
    }
    		
    [VB.NET]
    
    'Captcha validation
    Dim captchaInstance As Lanap.BotDetect.MvcCaptcha
    Dim captchaInstanceId As String
    
    captchaInstance = New _ 
      Lanap.BotDetect.MvcCaptcha("RegistrationCaptcha")
    
    captchaInstanceId = Request.Form(captchaInstance.CaptchaIdKey)
    
    ' the Captcha is only validated if it was included on the page
    If (Not (String.IsNullOrEmpty(captchaInstanceId))) Then
      If (Not (captchaInstance.Validate(captchaCode, captchaInstanceId))) Then
        ModelState.AddModelError("captchaCode", _ 
          "The CAPTCHA code was incorrect!")
      End If
    End If
    		

    thành:

    [C#]
    
    /// Captcha validation
    if (!(bool)this.RouteData.Values["captchaValid"])
    {
      ModelState.AddModelError("captchaCode", 
        "The CAPTCHA code was incorrect!");
    }
    		
    [VB.NET]
    
    'Captcha validation
    If (Not (CType(Me.RouteData.Values("captchaValid"), Boolean))) Then
      ModelState.AddModelError("captchaCode", _
        "The CAPTCHA code was incorrect!")
    End If
  • Nếu bạn muốn nâng cấp để nút Reload Captcha tự động xóa câu trả lời của người dùng, bạn có thể thêm vào phần khai báo script vào View. Ví dụ, trong dự án mẫu chúng tôi sử dụng:

    <%= Html.Captcha(registrationCaptcha) %gt;
    <p>
      <label for="captchaCode">Type the characters you see in the 
        picture:</label>
      <%= Html.TextBox("captchaCode") %>
      <%= Html.ValidationMessage("captchaCode")%>
    </p>
    <script type="text/javascript">
      function LBD_ClearUserInput() {
        var LBD_textBox = document.getElementById('captchaCode');
        if(LBD_textBox) {
          LBD_textBox.value = '';
        }
      }
      LBD_RegisterHandler('PreReloadCaptchaImage', LBD_ClearUserInput);
    </script>
    <%

Nâng cấp BotDetect ASP.NET CAPTCHA từ v2.0.12 lên v2.0.13

Phiên bản 2.0.13 của BotDetect ASP.NET CAPTCHA đã cập nhật phần chỉnh sửa cho nhiều lỗi, một vài lỗi yêu cầu kiểm tra trước khi cập nhật Lanap.BotDetect.dll lên phiên bản mới. Chi tiết các thay đổi trong lần phát hành này, xin hãy xem tại ghi chú khi phát hành v2.0.13.

Sinh ngẫu nhiên CAPTCHA

Nhiều vấn đề được tìm thấy với hàm xử lý sự kiện PreDrawCaptchaImage được dùng để sinh ngẫu nhiên hình ảnh Captcha. Trong tất cả các trang dùng hàm này để xử lý sự kiện, xin hay thay đổi mã nguồn như sau:

[C#]
void SampleCaptcha_PreDrawCaptchaImage(object sender, EventArgs e)
{
  captcha.CodeLength = RandomizationHelper.GetRandomCodeLength(4, 6);
  // other randomizations...
}

[VB.NET]
Protected Sub SampleCaptcha_PreDrawCaptchaImage(ByVal sender As 
  System.Object, ByVal e As System.EventArgs)
  
  captcha.CodeLength = RandomizationHelper.GetRandomCodeLength(4, 6)
  ' other randomizations...
End Sub

thành:

[C#]
void SampleCaptcha_PreDrawCaptchaImage(object sender, EventArgs e)
{

  ICaptcha captcha = sender as ICaptcha;
  if (captcha.CaptchaId != SampleCaptcha.CaptchaId)
  {
    return;
  }

  captcha.CodeLength = RandomizationHelper.GetRandomCodeLength(4, 6);
  // other randomizations...
}

[VB.NET]
Protected Sub SampleCaptcha_PreDrawCaptchaImage(ByVal sender As 
  System.Object, ByVal e As System.EventArgs)
	
  Dim captcha As ICaptcha = sender
  If (captcha.CaptchaId <> SampleCaptcha.CaptchaId) Then
    Return
  End If

  captcha.CodeLength = RandomizationHelper.GetRandomCodeLength(4, 6)
  ' other randomizations...
End Sub

Đồng thời thay thế SampleCaptcha trong đoạn mã trên với ID của Captcha được sử dụng trên từng trang.

Sắp xếp Captcha

Để sửa lỗi về mặt hiển thị khi nhiều Captcha được đặt trong cùng một trang, tất cả các khai báo của BotDetect trong file CSS đã được cập nhật sử dụng lớp CSS thay vì CSS ids. Nếu bạn khai báo BotDetect CSS đè lên giá trị mặc định (ví dụ, hiển thị nút reload bên phải nút speaker thay vì bên dưới), xin hãy cập nhật tương ứng.

Nâng cấp BotDetect ASP.NET CAPTCHA từ v2.0.10 lên v2.0.11

Phiên bản 2.0.11 của BotDetect ASP.NET CAPTCHA giới thiệu một số thay đổi đòi hởi bạn phải chú ý khi cập nhật từ phiên bản cũ. Chi tiết các thay đổi trong lần phát hành này, xin hãy xem tại Ghi chú khi phát hành v2.0.11.

Sinh ngẫu nhiên CAPTCHA

Mã nguồn sử dụng để sinh ngẫu nhiên giải thuật dùng để tạo hình ảnh CAPTCHA, độ dài ký tự Captcha... đã được cập nhật. Thay vì sinh ngẫu nhiên các thuộc tính của CAPTCHA trong phương thức Page (Page_Load, Page_PreRender, v.v.), mã nguồn sinh ngẫu nhiên phải được đặt ở hàm xử lý sự kiện mới Captcha_PreDrawCaptchaImage. Bạn có thể thấy mã nguồn mới trong Dự án mẫu sinh ngẫu nhiên CAPTCHA đi kèm với gói cài đặt BotDetect.

Điều này là cần thiết vì hàm của Page chỉ được gọi khi toàn bộ chu trình được thực thi trên máy chủ, và không được gọi trên mọi HttpHandler. Điều này có nghĩa rằng việc sinh ngẫu nhiên các thuộc tính của CAPTCHA trong phương thức Page không được thực hiện khi toàn bộ trang .aspx không được tải. Ví dụ, điều này xảy ra khi click vào nút Reload CAPTCHA, hay khi bot truy cập vào hình ảnh CAPTCHA trực tiếp, mà không tải lại trang. Cập nhật lại cách sinh ngẫu nhiên các thuộc tính của CAPTCHA sẽ đảm bảo chúng được sinh ngẫu nhiên mỗi khi hình ảnh CAPTCHA được tạo ra.

Đường dẫn CAPTCHA HttpHandler

Lần phát hành này của BotDetect bao gồm khả năng thay đổi toàn bộ đường dẫn của CAPTCHA HttpHandler. Nên thay đổi đường dẫn này với một giá trị duy nhất cho mỗi ứng dụng của bạn, vì nó có thể tăng tính bảo mật cho CAPTCHA.

Ví dụ, nếu bot cố gắng duyệt các website để tìm đường dẫn tới LanapCaptcha.aspx, nó trở nên hơi khó hơn để tự động nhận ra trang web của bạn sử dụng BotDetect CAPTCHA.

Để thay đổi đường dẫn BotDetect CAPTCHA HttpHandler thành CustomCaptchaHandler.ashx (ví dụ):

  • Thêm dòng này vào phần <appSettings> của file web.config:

    <appSettings>
      <add key="LBD_RequestPath" value="CustomCaptchaHandler.ashx" />
    </appSettings>
  • Cập nhật đăng ký HttpHandler trong phần <system.web> của file web.config:

    <httpHandlers>
      <add verb="*" path="CustomCaptchaHandler.ashx" 
        type="Lanap.BotDetect.CaptchaHandler, Lanap.BotDetect"/>
    </httpHandlers>

Người dùng sử dụng SharePoint

Vì thuộc tính LBD_RequestExtension đã được thay thế bởi thuộc tính LBD_RequestPath trong phiên bản 2.0.11, bạn phải thay đổi thiết lập của web.config tương ứng, thay thế:

<appSettings>
  <add key="LBD_RequestPath" value=".ashx" />
</appSettings>
<web.config>
  <httpHandlers>
    <add verb="*" path="LanapCaptcha.ashx" 
      type="Lanap.BotDetect.CaptchaHandler, Lanap.BotDetect" />
  </httpHandlers>

với

<<appSettings>
  <add key="LBD_RequestPath" value="BotDetectCaptcha.ashx" />
</appSettings>
<web.config>
  <httpHandlers>
    <add verb="*" path="BotDetectCaptcha.ashx" 
      type="Lanap.BotDetect.CaptchaHandler, Lanap.BotDetect" />
  </httpHandlers>

Nâng cấp BotDetect ASP.NET CAPTCHA từ v2.0.9 lên v2.0.10

Phiên bản 2.0.10 của BotDetect ASP.NET CAPTCHA giới thiệu một số thay đổi đòi hởi bạn phải chú ý khi cập nhật từ phiên bản cũ. Chi tiết các thay đổi trong lần phát hành này, xin hãy xem tại Ghi chú khi phát hành v2.0.10.

Sắp xếp Captcha

Lanap.BotDetect.Captcha đã được viết lại để để có ý nghĩa hơn, không sử dụng bảng HTML, và hầu hết các khai báo về hiển thị được chuyển vào một file CSS riêng biệt, Captcha có khả năng hiển thị vừa vặn nhiều kiểu khác nhau trong trang của bạn. Bạn có thể dễ dàng điều chỉnh bằng cách thay đổi khai báo trong file CSS.

Nút Reload CAPTCHA

Hơn nữa, vì nút để thay đổi mã CAPTCHA đã được thêm vào control và được mặc định là cho phép, bạn nên, ví dụ:

  • Xem lại việc sắp xếp control theo chiều ngang trên trang web của bạn, nếu bạn không dùng âm thanh CAPTCHA. Biểu tượng reload được hiển thị bên phải hình ảnh CAPTCHA.
  • Nếu bạn sử dụng âm thanh CAPTCHA và sử dụng chiều cao của hình ảnh CAPTCHA nhỏ hơn 50 pixels, hãy xem lại biểu tượng reload hiển thị dọc trên trang của bạn. Nếu bạn muốn hiển thị nó bên phải biểu tượng speaker (thay vì bên dưới), làm theo hướng dẫn sắp xếp biểu tượng theo chiều ngang.

Người dùng sử dụng ASP.NET Ajax

Vì khả năng tương thích với UpdatePanel đã được thêm vào Captcha control, giải pháp tạm thời cho AjaxCaptcha được đề cập trong UpdatePanel không cần thiết nữa. Cho dù giải pháp tạm thời này vẫn hoạt động tốt, nó không được khuyến khích sử dụng. Để ngừng sử dụng nó, chỉ việc quay về trước lúc thay đổi dùng giải pháp tạm thời.

Hơn nữa, nếu bạn không cho phép âm thanh CAPTCHA trong UpdatePanel bởi vì vấn đề tương thích với Firefox, bây giờ bạn có thể cho phép nó - vấn đề này là do lỗi của QuickTime v7.1.6, và nó đã được sửa trong các phiên bản mới của QuickTime.

Người dùng sử dụng SharePoint

Các phiên bản trước của BotDetect yêu cầu phải thay đổi nhỏ trong mã nguồn để thay đổi CAPTCHA handler, vì SharePoint không cho phép yêu cầu .aspx để ánh xạ vào non-SharePoint HttpHandler. Điều này hiện tại có thể thực hiện được với phiên bản chính thức của BotDetect, bằng cách chỉ ra extension để sử dụng trong file web.config - ví dụ:

<appSettings>
  <add key="LBD_RequestPath" value=".ashx" />
</appSettings>
<web.config>
  <httpHandlers>
    <add verb="*" path="LanapCaptcha.ashx" 
      type="Lanap.BotDetect.CaptchaHandler, Lanap.BotDetect" />
  </httpHandlers>

sẽ thay đổi yêu cầu về hình ảnh và âm thanh CAPTCHA để sử dụng phần mở rộng .ashx. Khi sử dụng các phần mở rộng khác nhau, đừng quên ánh xạ chúng trong ASP.NET Runtime trong thuộc tính của IIS.

Cũng cần chú ý chúng tôi đã phát hành hướng dẫn tạo SharePoint Web Part với BotDetect CAPTCHA cùng với việc cập nhật này.

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 CAPTCHA Migration Guides 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