Sử dụng reCAPTCHA với formMail

Lưu ý quan trọng: Phiên bản 1.0 của API reCAPTCHA không còn được hỗ trợ, vui lòng nâng cấp lên phiên bản 2.0. Tìm hiểu thêm

Dưới đây, chúng tôi sẽ giải thích cách thêm reCAPTCHA vào tập lệnh FormMail mà không cần sử dụng Mô-đun reCAPTCHA Perl. Nếu biết cách làm, bạn có thể sử dụng reCAPTCHA Mô-đun Perl.

Phía máy khách (Cách hiển thị hình ảnh CAPTCHA)

Trong trang HTML, bên trong <form> bạn phải thêm mã sau:

  <script type="text/javascript"
    src="http://www.google.com/recaptcha/api/challenge?k=your_public_key">
  </script>
  <noscript>
    <iframe src="http://www.google.com/recaptcha/api/noscript?k=your_public_key"
        height="300" width="500" frameborder="0"></iframe>

    <textarea name="recaptcha_challenge_field" rows="3" cols="40">
    </textarea>
    <input type="hidden" name="recaptcha_response_field"
        value="manual_challenge">
  </noscript>

Điều này chắc chắn sẽ xảy ra, nhưng dù sao chúng tôi vẫn sẽ nói: bạn cần phải thay thế cả hai các bản sao của your_public_key bằng khoá công khai mà bạn đã nhận được trong quá trình tạo tài khoản. Hãy cẩn thận để không sử dụng chính do nhầm lẫn.

Về cơ bản, việc này sẽ thêm hai tham số được truyền đến formmail.cgi (hoặc FormMail.pl) thông qua một yêu cầu POST, cụ thể là:

  • recaptcha_challenge_field: Đây là thử thách được tạo thông qua .
  • recaptcha_response_field: Đây là câu trả lời do người dùng gửi cho thử thách ở trên.
  • Phía máy chủ (Cách kiểm tra xem người dùng có nhập câu trả lời đúng hay không)

    Tiếp theo, bạn cần phải sửa đổi formmail.cgi (hoặc FormMail.pl) để xử lý hai thông số và để xác thực thử thách từ các máy chủ reCAPTCHA. Tại thời điểm này, có lẽ bạn nên hãy tạo một bản sao dự phòng của FormMail.pl để phòng trường hợp bị mất. Trong mã bên dưới, "+" có nghĩa là đường cần được thêm vào tập lệnh FormMail và "-" có nghĩa là bạn cần xoá dòng đó khỏi lớp đó. Trong mọi trường hợp, chúng tôi sẽ cho biết vị trí các dòng cần được thêm vào hoặc xoá bằng cách hiển thị các dòng liền kề trong tập lệnh FormMail.

    Trước tiên, bạn cần yêu cầu Perl sử dụng mô-đun LWP::UserAgent bằng cách thêm dòng sau tới FormMail:

     # ACCESS CONTROL FIX: Peter D. Thompson Yezek                                #
     #                     http://www.securityfocus.com/archive/1/62033           #
     ##############################################################################
     +use LWP::UserAgent;
     +
    

    (Điều này sẽ yêu cầu mô-đun LWP::UserAgent trong môi trường Perl. Hầu hết các bản cài đặt Perl đều có mô-đun này. Trong trường hợp mô-đun chưa được cài đặt, đây là một số hướng dẫn cơ bản về cách cài đặt Perl mô-đun.)

    Sau đó, thêm mã để gọi chức năng kiểm tra CAPTCHA được xác định bên dưới.

     # Check Required Fields
     &check_required;
    
     +# Check the captcha challenge and response.
     +&check_captcha;
     +
     # Send E-Mail
     &send_mail;
    
     # Return HTML Page or Redirect User
     &return_html;
    

    Bây giờ, hãy xác thực phản hồi CAPTCHA và tạo lỗi nếu phản hồi không khớp với thử thách.

     +##############################################################################
     +# Check the CAPTCHA response via the reCAPTCHA service.
     +sub check_captcha {
     +
     +      my $ua = LWP::UserAgent->new();
     +      my $result=$ua->post(
     +      'https://www.google.com/recaptcha/api/verify',
     +      {
     +          privatekey => 'your_private_key',
     +          remoteip   => $ENV{'REMOTE_ADDR'},
     +          challenge  => $Form{'recaptcha_challenge_field'},
     +          response   => $Form{'recaptcha_response_field'}
     +      });
     +
     +      if ( $result->is_success && $result->content =~ /^true/) {
     +              return;
     +      } else {
     +              &error('captcha_failed');
     +      }
     +}
     +
     # NOTE rev1.91: This function is no longer intended to stop abuse, that      #
     #    functionality is now embedded in the checks made on @recipients and the #
     #    recipient form field.                                                   #
    

    Cuối cùng, hãy tạo chức năng in thông báo lỗi trong trường hợp không thành công:

             if ($Config{'missing_fields_redirect'}) {
                 print "Location: " . &clean_html($Config{'missing_fields_redirect'}) . "\n\n";
             }
     +    }
     +    elsif ($error eq 'captcha_failed') {
     +            print <<"(END ERROR HTML)";
     +Content-type: text/html
     +
     +<html>
     + <head>
     +  <title>Error: Captcha Check Failed</title>
     + </head>
     + <body bgcolor=#FFFFFF text=#000000>
     + <center>
     +  <table border=0 width=600 bgcolor=#9C9C9C>
     +    <tr><th><font size=+2>Error: Captcha Check Failed</font></th></tr%gt;
     +   </table>
     +  <table border=0 width=600 bgcolor=#CFCFCF>
     +    <tr><td>The Captcha response of the form you submitted did not match the challenge.
     +     Please check the form and make sure that your response matches the challenge in the captcha image.
     +     You can use the browser back button to return to the form.
     +     </center%gt;
     +    </td></tr>
     +   </table>
     +  </center>
     + </body>
     +</html>
     +(END ERROR HTML)
     +    }
             else {
                  foreach $missing_field (@error_fields) {
                      $missing_field_list .= "<li>" . &clean_html($missing_field) . "\n";
     .
     .
     .
      </html>
     (END ERROR HTML)
             }
     -    }
     -
         exit;
     }
    

    Vậy là xong! reCAPTCHA lúc này sẽ hoạt động trên trang web của bạn.

    Tài liệu đọc thêm

  • Tuỳ chỉnh giao diện
  • Mẹo và nguyên tắc
  • Khắc phục sự cố