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

Ở đâ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 mình đang làm gì, bạn có thể sử dụng mô-đun reCAPTCHA Perl.

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

Trong trang HTML của bạn, bên trong phần tử <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>

Có thể không cần phải nói, nhưng chúng tôi vẫn sẽ nói rằng: bạn cần thay thế 2 thực thể 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 khoá riêng tư do nhầm lẫn.

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

  • recaptcha_challenge_field Đây là thử thách được tạo thông qua khoá công khai của bạn.
  • recaptcha_response_field: Đây là phản hồ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 đã nhập đúng câu trả lời hay chưa)

    Tiếp theo, bạn cần sửa đổi formmail.cgi (hoặc formMail.pl) để xử lý hai tham số và xác thực thử thách từ máy chủ reCAPTCHA. Tại thời điểm này, có lẽ bạn nên tạo bản sao lưu của formMail.pl. Trong mã bên dưới, "+" có nghĩa là dòng cần được thêm vào tập lệnh formMail và "-" có nghĩa là dòng cần được xóa khỏi tập lệnh đó. Trong mọi trường hợp, chúng tôi sẽ chỉ ra vị trí cần thêm hoặc xoá các dòng 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 vào formMail:

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

    (Việc này sẽ yêu cầu mô-đun LWP::UserAgent phải ở trong môi trường Perl của bạn. 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, sau đây là một số hướng dẫn cơ bản về cách cài đặt các mô-đun Perl.)

    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ách thức.

     +##############################################################################
     +# 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 hàm in thông báo lỗi trong trường hợp kiểm tra 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 hiện đã hoạt động trên trang web của bạn.

    Đọc thêm

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