Hỏi đáp về BotDetect CAPTCHA ASP
Trang này bao gồm các câu trả lời cho các câu hỏi thường gặp về cài đặt, triển khai và hiện thực BotDetect ASP CAPTCHA.
I. Cài đặt
- BotDetect ASP CAPTCHA có chạy được với IIS 4.0 chạy trên Windows NT?
- BotDetect ASP CAPTCHA có thể được cài đặt trên máy chủ Lotus Notes Domino?
- Tôi đang sử dụng một tài khoản mua lại trên một máy chủ dùng chung và chỉ truy cập được qua FTP. Tôi có cần phải có quyền admin để cài đặt và sử dụng BotDetect ASP CAPTCHA hay không?
- Tôi có thể đăng ký Lanapsoft BotDetect ASP CAPTCHA bằng tay được không hay tôi phải chạy gói cài đặt trên máy chủ?
II. Triển khai
- Tôi đã mua phiên bản đầy đủ của BotDetect ASP CAPTCHA. Tôi có phải khởi động lại IIS hay không? Có cách nào khác để nâng cấp phiên bản dùng thử hay không?
- Tôi đang cố gắng unregister (hoặc register phiên bản mới của) LanapBotDetect.dll. Tác vụ thất bại vì lỗi sharing violation.
- Tôi đã gỡ bỏ phiên bản dùng thử của BotDetect ASP CAPTCHA và cài đặt phiên bản đầy đủ, nhưng ứng dụng của tôi vẫn hiển thị LANAP 50% số lần xuất hiện.
- Sau khi đã triển khai BotDetect ASP CAPTCHA, máy chủ báo lỗi Access Error. Component được cài đặt với quyền Everyone.
- Tôi vừa mới cài đặt BotDetect ASP CAPTCHA trên máy chủ Windows 2003. Mọi thứ hoạt động tốt, nhưng dường như mỗi khi hình ảnh CAPTCHA được tạo ra, hai dòng Security Log được tạo ra trong file GDIPFONTCACHEV1.DAT, và tôi không biết nó được sinh ra từ đâu.
- Chúng tôi đã xây dựng xong trang web với BotDetect ASP CAPTCHA vài tháng qua. Khi chúng tôi triễn khai nó trên môi trường máy chủ cân bằng tải (load-balanced), hình ảnh CAPTCHA không thể hiển thị trong khoảng 50% số lần thử.
- File LanapBotDetectHandler.asp có phải nằm trong cùng thư mục với trang web sử dụng nó hay không? Nếu tôi di chuyển file LanapBotDetectHandler.asp vào thư mục khác (ví dụ như thư mục include), thì việc xác thực và audio CAPTCHA không thực hiện được. Dường như là không có biến session nào được lưu.
III. Hiện thực
- Làm thể nào để sử dụng BotDetect CAPTCHA trong FrontPage?
- Bạn có thể cho biết liệu BotDetect CAPTCHA có thể được điều khiển bởi PHP hay không, có ví dụ nào dùng PHP hay không?
- Khi thiết lập cấu hình cho BotDetect ASP, có thể thay đổi được giải thuật CAPTCHA mỗi lần hình ảnh được sinh ra hay không?
- Một số người dùng phàn nàn răng hình ảnh CAPTCHA không thay đổi. Làm cách nào để trang ASP tải lại hình ảnh CAPTCHA từ máy chủ thay vì từ bộ đệm của trình duyệt?
- Hình ảnh CAPTCHA hiển thị chính xác trên trang web của tôi, nhưng ASP form được gửi bất chấp câu trả lời của người sử dụng là đúng hay sai.
- Khi đọc mã nguồn trong file LanapBotDetectHandler.asp đi kèm với phiên bản dùng thử của BotDetect CAPTCHA, Tôi thấy bạn dùng biến Session để lưu ký tự CAPTCHA. Có thể sử dụng cách khác để lưu ký tự CAPTCHA được không, hay là chỉ có thể dùng biến Session trong trang ASP?
- Tôi đang gặp trục trặc với BotDetect CAPTCHA – hầu như âm thanh CAPTCHA không đúng với ký tự được hiển thị và việc xác thực không đúng. Dường như là nó chạy đúng khi trên website của tôi chỉ sử dụng CAPTCHA trên một trang, nhưng ngay khi tôi dùng CAPTCHA trên nhiều trang, thì trục trặc lại xuất hiện. Bạn có ví dụ nào về việc sử dụng CAPTCHA trên nhiều trang ASP hay không?
- Dường như là hình ảnh CAPTCHA gặp vấn đề khi người dùng nhấn vào nút "BACK" trên trình duyệt. Khi trở về trang được bảo vệ bằng CAPTCHA sử dụng nút Back, hình ảnh CAPTCHA mới được hiển thị trên IE7, trong khi hình ảnh CAPTCHA không đổi trên Firefox 2.0. Tôi đã thêm một biến thời gian vào câu truy vấn khi yêu cầu hiển thị hình ảnh CAPTCHA, tuy nhiên, nó vẫn không thể hiển thị hình ảnh mới trong Firefox. Bạn có giải pháp nào không?
- Tôi muốn thực hiện việc xác thực trên phía máy khách mà không cần phải gửi kết quả từ máy chủ. Việc này có thực hiện được không?
- Tôi có một trang với rất nhiều trường được bảo vệ bởi BotDetect CAPTCHA, và khi người sử dụng nhập đúng câu trả lời nhưng phía máy chủ lại thông báo kết quả xác thực sai cho những trường khác. Có cách nào giữ lại câu trả lời và hình ảnh CAPTCHA trong khi vẫn để người dùng chỉnh sửa những trường khác, như vậy người dùng không phải trả lời CAPTCHA nhiều lần chỉ vì họ nhập sai một số trường nào đó hay không
I. Cài đặt
BotDetect ASP CAPTCHA có chạy được với IIS 4.0 chạy trên Windows NT?
Không, yêu cầu hệ thống tối thiểu dành cho BotDetect ASP CAPTCHA là Windows 2000 và IIS 5.0.
BotDetect ASP CAPTCHA có thể được cài đặt trên máy chủ Lotus Notes Domino?
Không, sản phẩm của chúng tôi đòi hỏi IIS 5.0+ để vận hành chính xác.
Tôi có thể đăng ký Lanapsoft BotDetect ASP CAPTCHA bằng tay được không hay tôi phải chạy gói cài đặt trên máy chủ?
Không cần thiết phải chạy gói cài đặt. Bạn chỉ cần copy LanapBotDetect.dll và gdiplus.dll vào cùng một thư mục ở bất cứ đâu trên máy chủ (ví dụ, C:\Temp\) rồi thực hiện dòng lệnh sau:
regsvr32 /i "C:\Temp\LanapBotDetect.dll"
II. Triển khai
Tôi đã mua phiên bản đầy đủ của BotDetect ASP CAPTCHA. Tôi có phải khởi động lại IIS hay không? Có cách nào khác để nâng cấp phiên bản dùng thử hay không?
Tôi đang cố gắng unregister (hoặc register phiên bản mới của) LanapBotDetect.dll. Tác vụ thất bại vì lỗi sharing violation.
Bạn cần phải khởi động lại IIS trước khi đăng ký phiên bản mới của BotDetect vì đó là cách duy nhất để IIS giải phóng file LanapBotDetect.dll. Thật không may là không có cách nào khác - IIS được thiết kế hoạt động như vậy.
Sau đây là các bước nâng cấp:
- Copy file LanapBotDetect.dll vào máy chủ
- Ngừng IIS
- Đăng ký phiên bản LanapBotDetect.dll với lệnh regsvr32.exe.
- Khởi động IIS
Tôi đã gỡ bỏ phiên bản dùng thử của BotDetect ASP CAPTCHA và cài đặt phiên bản đầy đủ, nhưng ứng dụng của tôi vẫn hiển thị LANAP 50% số lần xuất hiện.?
Bạn vẫn đang còn dùng bản dùng thử của BotDetect.
Đăng ký lại LanapBotDetect.dll với lệnh regsvr32.exe. Kiểm tra để chắc chắn đó là bản đầy đủ. Bạn có thể kiểm tra bằng cách click phải chuột vào file .dll rồi chọn Properties, chuyển tới tab Version và kiểm tra dòng Description – như hình dưới đây:
Sau khi đã triển khai BotDetect ASP CAPTCHA, máy chủ báo lỗi Access Error. Component được cài đặt với quyền Everyone.
Sau đây là thông báo lỗi chi tiết:
Server object error 'ASP 0178 : 80070005' Server.CreateObject Access Error LanapBotDetectHandler.asp, line 8 The call to Server.CreateObject failed while checking permissions. Access is denied to this object.
Để khắc phục lỗi này, phân quyền Đọc và Thực thi trên file dạng NTFS tới tài khoản phù hợp (IUSR_<machinename>, NETWORK SERVICE) cho file LanapBotDetect.dll. Click phải lên file LanapBotDetect.dll, rồi chọn Properties, chuyển qua tab Security và thay đổi quyền.
Lỗi này rất giống với: http://support.microsoft.com/default.aspx?scid=KB;en-us;q278013.
Tôi vừa mới cài đặt BotDetect ASP CAPTCHA trên máy chủ Windows 2003. Mọi thứ hoạt động tốt, nhưng dường như mỗi khi hình ảnh CAPTCHA được tạo ra, hai dòng Security Log được tạo ra trong file GDIPFONTCACHEV1.DAT, và tôi không biết nó được sinh ra từ đâu.?
Sau đây là thông báo lỗi chi tiết::
Object Open:
Object Server: Security
Object Type: File
Object Name: C:\GDIPFONTCACHEV1.DAT
Handle ID: -
Operation ID: {0,174293}
Process ID: 2120
Image File Name: C:\WINDOWS\system32\inetsrv\w3wp.exe
Primary User Name: NETWORK SERVICE
Primary Domain: NT AUTHORITY
Primary Logon ID: (0x0,0x3E4)
Client User Name: IUSR_CAMOBAP01
Client Domain: CAMOBAP01
Client Logon ID: (0x0,0x2A0F3)
Accesses: READ_CONTROL
SYNCHRONIZE
ReadData (or ListDirectory)
WriteData (or AddFile)
AppendData (or AddSubdirectory or
CreatePipeInstance)
ReadEA
WriteEA
ReadAttributes
WriteAttributes
Privileges: -
Restricted Sid Count: 0
Access Mask: 0x12019F
Có vẻ như nguyên nhân là do GDI+ muốn ghi file tạm gdipfontcachev1.dat vào một folder nào đó mà nó không có quyền ghi. Vì gdiplus.dll được load bởi LanapBotDetect.dll, mà dll thì được load bởi IIS (ví dụ w3wp.exe), GDI+ chạy dưới một tài khoản có quyền giới hạn.
Không may là chúng tôi không thể tìm thiết lập nào phù hợp để GDI+ không thực hiện việc ghi file tạm này, hay chỉ định thư mục nào đó để ghi. Nhưng tin tốt là nó chỉ cần ghi file này một lần duy nhất. Vì vậy, dưới đây là giải pháp để khắc phục vấn đề:
- Tạm thời thiết lập quyền truy cập cho "Everyone" vào ổ đĩa C:\
- Chạy trang web để GDI+ tạo file tạm trong thư mục gốc của C:\
- Copy file này vào C:\Windows\System32 sau đó đổi quyền Modify thành Everyone
- Xoá file C:\gdipfontcachev1.dat và khôi phục quyền truy cập trên thư mục C:\ về trạng thái ban đầu
- Lỗi sẽ không còn xảy ra.
Chúng tôi đã xây dựng xong trang web với BotDetect ASP CAPTCHA vài tháng qua. Khi chúng tôi triễn khai nó trên môi trường máy chủ cân bằng tải (load-balanced), hình ảnh CAPTCHA không thể hiển thị trong khoảng 50% số lần thử.
Khi dùng máy chủ cân bằng tải, bạn phải đảm bảo rằng máy khách trả về dữ liệu về trạng thái Session trên tất cả các yêu cầu HTTP sau yêu cầu đầu tiên (như là cho phép sticky connections). Hãy kiểm tra thiết lập của máy chủ cân bằng tải.
Bước này là cần thiết vì trạng thái của ASP Session được lưu giữ trên tiến trình xử lý trong bộ nhớ, chỉ tồn tại trên máy chủ mà tiến trình đang chạy, nó không được chia sẽ cho nhiều máy chủ khác nhau.
File LanapBotDetectHandler.asp có phải nằm trong cùng thư mục với trang web sử dụng nó hay không? Nếu tôi di chuyển file LanapBotDetectHandler.asp vào thư mục khác (ví dụ như thư mục include), thì việc xác thực và audio CAPTCHA không thực hiện được. Dường như là không có biến session nào được lưu.
Lưu file LanapBotDetectHandler.asp trong cùng thư mục với file .asp là giải pháp đơn giản nhất. Bạn cũng có thể lưu một bản duy nhất của file LanapBotDetectHandler.asp và sử dụng nó cho nhiều trang khác nhau, nhưng những trang này phải nằm chung trong một ứng dụng ASP.
Mỗi thư mục ảo của IIS, dùng để phân chia các ứng dụng ASP, sẽ có một file Global.asa riêng và trạng thái Session riêng. Ví dụ, bạn có thể di chuyển file từ
http://localhost/BotDetectASPSamples/CaptchaFeatures/LanapBotDetectHandler.asp
vào
http://localhost/BotDetectASPSamples/LanapBotDetectHandler.asp
và tiếp tục sử dụng nó trên trang
http://localhost/BotDetectASPSamples/CaptchaFeatures/BotDetectFeaturesDemo.asp
vì rằng http://localhost/BotDetectASPSamples/ là ứng dụng, trong khi CaptchaFeatures/ và CaptchaValidation/ chỉ là thư mục con của cùng một ứng dụng.
Tuy nhiên, bạn không thể sử dụng file đó từ bất cứ nơi nào khác ngoài ứng dụng http://localhost/BotDetectASPSamples/ , hay thậm chí bạn tạo ứng dụng khác khỏi CaptchaFeatures/ và CaptchaValidation/.
III. Hiện thực
Làm thể nào để sử dụng BotDetect CAPTCHA trong FrontPage?
Bạn có thể dùng FrontPage nếu như bạn dùng ASP hoặc PHP cho việc xử lý dữ liệu. Nếu bạn dùng FrontPage Server Extensions thì không được.
Bạn có thể cho biết liệu BotDetect CAPTCHA có thể được điều khiển bởi PHP hay không, có ví dụ nào dùng PHP hay không?
Có, BotDetect CAPTCHA có thể được tích hợp với trang PHP, nhưng chỉ hỗ trợ máy chủ chạy Windows (vì rằng nó là một COM component). Bạn có thể tìm hiểu hướng dẫn chi tiết tại Hướng dẫn sử dụng BotDetect CAPTCHA để bảo vệ trang PHP.
Khi thiết lập cấu hình cho BotDetect ASP, có thể thay đổi được giải thuật CAPTCHA mỗi lần hình ảnh được sinh ra hay không?
Bạn có thể thay đổi ngẫu giá trị của toàn bộ thuộc tính của BotDetect CAPTCHA. Sau đây là mã nguồn ví dụ cách chọn ngẫu nhiên giải thuật CAPTCHA từ một tập hợp các giá trị cho trước được viết bằng ASP:
<% Function RandomFromRange(lowerLimit, upperLimit) Dim num Randomize num = CInt((upperlimit - lowerlimit)*Rnd() + lowerlimit) RandomFromRange = num End Function Function RandomFromValues(values) Dim num Randomize num = RandomFromRange(0, UBound(values)) RandomFromValues = values(num) End Function Dim algorithms(5) algorithms(0) = 28 'Lego algorithms(1) = 36 'MeltingHeat algorithms(2) = 44 'Ghostly algorithms(3) = 25 'FingerPrints algorithms(4) = 39 'Graffiti2 algorithms(5) = 48 'Bullets ' choose a random TextStyle Dim style style = RandomFromValues(algorithms) %> <img src= "LanapBotDetectHandler.asp?Command= CreateImage&TextStyle=<%=style%>" alt="CAPTCHA image" />
Một số người dùng phàn nàn răng hình ảnh CAPTCHA không thay đổi. Làm cách nào để trang ASP tải lại hình ảnh CAPTCHA từ máy chủ thay vì từ bộ đệm của trình duyệt?
Bạn có thể bắt buộc hình ảnh CAPTCHA phải được tải lại từ máy chủ thay vì từ bộ đệm của trình duyệt bằng cách thêm thời gian hiện tại vào câu truy vấn Url:
<img src="LanapBotDetectHandler.asp?Command=CreateImage&t=
<%= year(now) & right("0" & month(now),2) & _
right("0" & day(now),2) & right("0" & hour(now),2) & _
right("0" & minute(now),2) & right("0" & second(now),2)
%>"
alt="CAPTCHA image" />
Hình ảnh CAPTCHA hiển thị chính xác trên trang web của tôi, nhưng ASP form được gửi bất chấp câu trả lời của người sử dụng là đúng hay sai.
Hình như là bạn đã quên không thêm đoạn mã để xác thực vào ASP script xử lý dữ liệu cho trang web của bạn. Bạn có thể xem Dự án mẫu sử dụng CAPTCHA tại Hướng dẫn sử dụng BotDetect CAPTCHA để bảo vệ trang ASP.
Bạn cũng có thể muốn xem Ví dụ xử lý Form đi kèm với gói cài đặt. Chú ý rằng mã nguồn trong file ProcessingFormDemo.asp chỉ được dùng để sinh hình ảnh CAPTCHA. Việc xác thực được viết trong script xử lý dữ liệu trong file ProcessForm.asp.
Khi đọc mã nguồn trong file LanapBotDetectHandler.asp đi kèm với phiên bản dùng thử của BotDetect CAPTCHA, Tôi thấy bạn dùng biến Session để lưu ký tự CAPTCHA. Có thể sử dụng cách khác để lưu ký tự CAPTCHA được không, hay là chỉ có thể dùng biến Session trong trang ASP?
Có, bạn có thể lưu ký tự CAPTCHA trong bất kỳ biến máy chủ nào phù hợp với ứng dụng của bạn. LanapBotDetectHandler.asp sử dụng trạng thái ASP Session sẵn có để cho đơn giản, nhưng bạn có thể tuỳ ý thay thế với phương pháp của bạn (ví dụ: lưu dưới cơ sở dữ liệu được chia sẽ với nhiều máy chủ cân bằng tải).
Tôi đang gặp trục trặc với BotDetect CAPTCHA – hầu như âm thanh CAPTCHA không đúng với ký tự được hiển thị và việc xác thực không đúng. Dường như là nó chạy đúng khi trên website của tôi chỉ sử dụng CAPTCHA trên một trang, nhưng ngay khi tôi dùng CAPTCHA trên nhiều trang, thì trục trặc lại xuất hiện. Bạn có ví dụ nào về việc sử dụng CAPTCHA trên nhiều trang ASP hay không?
Giải thích
Vì ký tự của BotDetect CAPTCHA được lưu trong ASP Session state trên máy chủ, các CAPTCHA khác nhau trên những trang khác nhau trong cùng một ứng dụng ASP cần phải sử dụng biến trạng thái Session khác nhau để lưu ký tự CAPTCHA.
Vấn đề bạn đang gặp là do người dùng mở nhièu tab trên cùng một trình duyệt với nhiều trang có CAPTCHA, điều này dẫn tới ký tự CAPTCHA của trang sau ghi đè lên ký tự CAPTCHA của trang trước.
Giải pháp
Sử dung BotDetect CAPTCHA trên nhiều trang trong cùng một website cần phải thay đổi vài chỗ trong mã nguồn ASP.
- Thay thế file LanapBotDetectHandler.asp trên trang web của bạn với bản mới nhất của BotDetect ASP v2.0.8.
- Với mỗi trang trong website của bạn, chỉ định một CAPTCHA ID duy nhất cho CAPTCHA trên trang đó – ví dụ, nếu bạn dùng CAPTCHA trên cả trang đăng ký và trang liên lạc, bạn có thể đặt tên nó là RegistrationCaptcha và ContactCaptcha.
Trên mỗi trang ASP, thay đổi đoạn mã hiển thị CAPTCHA – trong đường dẫn hình ảnh và âm thanh CAPTCHA, thêm vào CaptchaId trong câu truy vấn, sử dụng ID cho trang đó ở bước trên. Ví dụ, thay đổi
<img id="CaptchaImage" alt="CAPTCHA Code" src="LanapBotDetectHandler.asp?Command=CreateImage" />
thành
<img id="CaptchaImage" alt="CAPTCHA Code" src="LanapBotDetectHandler.asp?Command=CreateImage &CaptchaId=RegistrationCaptcha" />và
<a href="LanapBotDetectHandler.asp?Command=CreateSound" onclick="LBD_LoadSound('soundPlaceholder', 'LanapBotDetectHandler.asp?Command=CreateSound'); return false;" title="Play CAPTCHA audio">thành
<a href="LanapBotDetectHandler.asp?Command=CreateSound &CaptchaId=RegistrationCaptcha" onclick="LBD_LoadSound('soundPlaceholder', 'LanapBotDetectHandler.asp?Command=CreateSound&CaptchaId= RegistrationCaptcha'); return false;" title="Play CAPTCHA audio">Trên mỗi trang, thay đổi việc xác thực CAPTCHA cho phù hợp với CaptchaId giá trị của: LanapBotDetectCode sẽ trở thành LanapBotDetectCode_<CaptchaId>.Ví dụ, thay đổi
Dim result, codeKey, inputCode result = False codeKey = "LanapBotDetectCode" inputCode = Request("CaptchaCode") If (Session(codeKey)<>"") Then code = Session(codeKey) result = (0 = StrComp(inputCode, code, 1)) 'each Captcha code can only be validated once Session(codeKey) = "" End Ifthành
Dim result, codeKey, inputCode result = False codeKey = "LanapBotDetectCode_RegistrationCaptcha" inputCode = Request("CaptchaCode") If (Session(codeKey)<>"") Then code = Session(codeKey) result = (0 = StrComp(inputCode, code, 1)) 'each Captcha code can only be validated once Session(codeKey) = "" End If
Khi bạn thay đổi, mỗi trang sẽ sử dụng một khoá ASP Session state khác nhau và khi mở nhiều trang chứa CAPTCHA khác nhau sẽ không bị đụng độ giữa các ký tự CAPTCHA.
Các bước tiếp theo
Trong khi những thay đổi này sẽ tránh được vấn đề khi sử dụng CAPTCHA để bảo vệ nhiều trang, nó không giải quyết được vấn đề khi mở cùng một trang trên nhiều tab của trình duyệt.
Để giải quyết vấn đề này, bạn cần phải thêm biến thời gian hoặc GUID vào CaptchaId của tham số câu truy vấn, để gán các khoá khác nhau cho các tab khác nhau.
Nếu việc xác thực CAPTCHA được thực hiện ở nhiều trang ASP khác nhau, bạn phải lưu lại nó (ví dụ, trong một trường ẩn).
Dường như là hình ảnh CAPTCHA gặp vấn đề khi người dùng nhấn vào nút "BACK" trên trình duyệt. Khi trở về trang được bảo vệ bằng CAPTCHA sử dụng nút Back, hình ảnh CAPTCHA mới được hiển thị trên IE7, trong khi hình ảnh CAPTCHA không đổi trên Firefox 2.0. Tôi đã thêm một biến thời gian vào câu truy vấn khi yêu cầu hiển thị hình ảnh CAPTCHA, tuy nhiên, nó vẫn không thể hiển thị hình ảnh mới trong Firefox. Bạn có giải pháp nào không?
Vì sự hoạt động của nút Back của trình duyệt không được ghi rõ trong bất kỳ chuẩn nào, nên các trình duyệt khác nhau nút Back hoạt động khác nhau. Để Firefox thay đổi hình ảnh CAPTCHA, bạn phải thay đổi như sau:
Chắc chắn rằng bạn đang sử dụng phiên bản BotDetect ASP CAPTCHA v2.0.8 hoặc mới hơn, vì phiên bản này đã bao gồm những thay đổi trong BotDetect CAPTCHA image Http Response headers từ
Response.CacheControl = "no-cache"
thành
Response.CacheControl = "no-cache, no-store, must-revalidate"
-
Thay đổi trang ASP dùng để hiển thị hình ảnh CAPTCHA, thêm đoạn mã sau vào phần đầu của mã nguồn ASP:
<% 'prevent caching of the whole page Response.CacheControl = "no-cache, no-store, must-revalidate" Response.AddHeader "Pragma", "no-cache" Response.Expires = -1 'utility function for querystring-friendly GUID generation Function createGuid() Set TypeLib = Server.CreateObject("Scriptlet.TypeLib") tg = TypeLib.Guid guid = Left(tg, len(tg)-2) set regEx = New RegExp regEx.IgnoreCase = False regEx.Global = True regEx.Pattern = "[{}-]" createGuid = regEx.Replace(guid, "") Set TypeLib = Nothing End Function %> Thay đổi mã nguồn ASP, ví dụ
<img id="CaptchaImage" alt="CAPTCHA Code" src="LanapBotDetectHandler.asp?Command=CreateImage &TextStyle=0&ImageWidth=250&imageHeight=50&CodeLength=5 &CodeType=0" />thành
<img id="CaptchaImage" alt="CAPTCHA Code" src="LanapBotDetectHandler.asp?Command=CreateImage &TextStyle=0&ImageWidth=250&imageHeight=50&CodeLength=5 &CodeType=0&t=<%=createGuid()%>" />
Thay vì dùng thời gian, đoạn mã này dùng GUID để đảm bảo mỗi trang sử dung các chuỗi truy vấn khác nhau.
Thêm nữa, cần thiết phải chặn việc caching toàn bộ trang web, vì nếu không Firefox sẽ load trang từ bộ đệm khi sử dung nút Back, dẫn đến việc hiển thị lại hình ảnh trước.
Sau khi thực hiện những thay đổi này, Firefox sẽ tải lại hình ảnh CAPTCHA khi bấm nút Back.
Tôi muốn thực hiện việc xác thực trên phía máy khách mà không cần phải gửi kết quả từ máy chủ. Việc này có thực hiện được không?
Nếu bạn muốn tránh phải gửi lại toàn trang, bạn có thể tham khảo Mã nguồn ví dụ xác thực BotDetect CAPTCHA dùng Ajax, dùng jQuery Ajax để yêu cầu chỉ gửi và tải lại một phần của trang web chứa CAPTCHA.
Mặt trái của việc xác thực CAPTCHA trên máy khách
Việc xác thực CAPTCHA hoàn toàn trên máy khách (mà không giao tiếp với máy chủ) không được hỗ trợ bởi BotDetect, vì nếu như vậy thì CAPTCHA đó rất dễ bị bẻ gãy. Ví dụ:
- Nếu bạn muôn người dùng chỉ được gửi lời bình sau khi đã trả lời đúng CAPTCHA.
- Nếu việc xác thực được thực hiện trên máy khách, điều này có nghĩa rằng mã JavaScript phải gửi lời bình lên máy chủ khi ký tự CAPTCHA được nhập chính xác.
- Vì vậy spammer chỉ cần trả lời CAPTCHA một lần, và ghi nhớ bạn sử dụng kết quả như thế nào: ví dụ như gửi một câu truy vấn đặc biệt với tham số POST, hoặc chuyển sang một trang nào đó.
- Sau đó, chúng có thể giả lập hành động tương tự trong chương trình tự động và hoàn toàn vượt qua CAPTCHA - bằng việc giả dạng đơn giản tham số POST , hoặc truy cập trực tiếp vào trang kết quả.
- Bạn có thể trở lại việc xác thực CAPTCHA ở phía máy khách bằng việc xác thực cùng một câu trả lời trên máy chủ một khi gửi dữ liệu của trang và trước khi lưu lại lời bình.
- Nhưng vì bạn giữ câu trả lời đúng của CAPTCHA trên máy khách, bots có thể dễ dàng truy cập vào câu trả lời đó và luôn luôn trả lời đúng CAPTCHA.
Chi tiết chính xác tuỳ thuộc vào cách sử dụng CAPTCHA của bạn. Nhưng cần thiết là, tất cả các đoạn mã ở phía máy khách là không bảo mật và có thể bị giả danh bởi chương trình tự động. Kết quả là, ký tự CAPTCHA chỉ được lưu trên máy chủ, và tất cả việc xác thực CAPTCHA cũng phải được thực hiện trên máy chủ.
Xác thực CAPTCHA trên máy khách - giải pháp
Bạn có thể tránh việc gửi lại toàn bộ trang web bằng việc sử dụng jQuery hoặc một thư viện Ajax khác để tạo yêu cầu xác thực CAPTCHA tới máy chủ, và xử lý kết quả trên máy khách:
- Khi việc xác thực Ajax CAPTCHA trả về kết quả sai, bạn có thể hiển thị hình ảnh CAPTCHA mới mà không ảnh hưởng đến phần còn lại của trang web, vì vậy có thể tăng tính dễ dàng sử dụng cho trang web đó.
- Bạn nên luôn luôn thay đổi ký tự CAPTCHA trong những trường hợp đó, vì cho phép trả lời nhiều lần cho cùng một ký tự CAPTCHA sẽ làm cho OCR dễ đoán được câu trả lời.
- Khi việc xác thực Ajax CAPTCHA thành công, bạn nên gửi dữ liệu lên máy chủ và xác thực lại câu trả lời.
- Chỉ sau khi việc xác thực CAPTCHA trên phía máy chủ thành công, bạn mới cho phép thực hiện các hành động được bảo vệ (ví dụ như lưu lời bình) trên máy chủ.
Tôi có một trang với rất nhiều trường được bảo vệ bởi BotDetect CAPTCHA, và khi người sử dụng nhập đúng câu trả lời nhưng phía máy chủ lại thông báo kết quả xác thực sai cho những trường khác. Có cách nào giữ lại câu trả lời và hình ảnh CAPTCHA trong khi vẫn để người dùng chỉnh sửa những trường khác, như vậy người dùng không phải trả lời CAPTCHA nhiều lần chỉ vì họ nhập sai một số trường nào đó hay không?
Nếu người dùng trả lời đúng ký tự CAPTCHA nhưng sai username, rõ ràng là họ không cần phải trả lời CAPTCHA khác. Mục đích của CAPTCHA là đảm bảo người dùng là con người, và khi họ đã trả lời đúng vào lần đầu tiên, họ đã vượt qua phép thử.
Nếu bạn phải đưa họ quay lại trang vì họ nhập sai các trường khác, tốt nhất là không nên hiển thị CAPTCHA nữa, vì mục đích sử dụng nó đã đạt được. Cách dễ nhất để nhớ là người dùng đã trả lời CAPTCHA thành công là lưu trên máy chủ, ví dụ:
<%
'Captcha validation
Dim result, codeKey, inputCode
result = False
codeKey = "LanapBotDetectCode"
inputCode = Request("CaptchaCode")
If (Session(codeKey)<>"") Then
code = Session(codeKey)
result = (0 = StrComp(inputCode, code, 1))
'each Captcha code can only be validated once
Session(codeKey) = ""
End If
Session("isHuman") = result
Then, the stored value is checked before displaying the CAPTCHA to the user, and the CAPTCHA is only displayed if it hasn't already been solved:
<% If (Not(Session("isHuman")<>"" And Session("isHuman"))) Then %>
'show the Captcha image and textbox only if not solved already
<div id="PromptDiv">Retype the code from the picture</div>
<div id="CaptchaDiv">
<div id="CaptchaImage">
<img id="SampleForm_CaptchaImage"
src="LanapBotDetectHandler.asp?Command=CreateImage"
alt="CAPTCHA Code Image" />
</div>
'...
<% End If %>
Vì lý do bảo mật, không thể thấy hai hình ảnh BotDetect CAPTCHA giống hệt nhau trong hai lần tải khác nhau, cũng không sử dụng cùng một mã cho nhiều hơn một hình ảnh CAPTCHA.
Phiên bản hiện tại của BotDetect
- BotDetect ASP.NET CAPTCHA v2.0.152009–11–23
- BotDetect ASP CAPTCHA v2.0.92009–02–12
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 CAPTCHA ASP FAQ 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.





