Używanie reCAPTCHA z FormMail

Ważne: interfejs API reCAPTCHA w wersji 1.0 nie jest już obsługiwany. Uaktualnij go do wersji 2.0. Więcej informacji

Poniżej objaśnimy, jak dodać reCAPTCHA do skryptu FormMail bez używania modułu Perl reCAPTCHA. Jeśli wiesz, co robisz, możesz też użyć modułu reCAPTCHA Perl.

Po stronie klienta (jak wyświetlić obraz CAPTCHA)

W elemencie <form> na stronie HTML musisz dodać ten kod:

  <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>

Prawdopodobnie jest to oczywiste, ale my też to zrobimy: w obu przypadkach your_public_key musisz zastąpić te 2 wystąpienia kluczem publicznym otrzymanym podczas tworzenia konta. Uważaj, by przez przypadek nie użyć swojego klucza prywatnego.

Spowoduje to dodanie dwóch parametrów, które są przekazywane do pliku formmail.cgi (lub FormMail.pl) za pomocą żądania POST:

  • recaptcha_challenge_field: to wyzwanie utworzone przy użyciu Twojego klucza publicznego.
  • recaptcha_response_field: to jest odpowiedź przesłana przez użytkownika na powyższe zadanie.
  • Po stronie serwera (jak sprawdzić, czy użytkownik wpisał poprawną odpowiedź)

    Następnie musisz zmodyfikować plik formmail.cgi (lub FormMail.pl) tak, aby obsługiwał oba parametry i zweryfikować zadanie z serwerów reCAPTCHA. W tym momencie warto na wszelki wypadek utworzyć kopię zapasową strony FormMail.pl. W poniższym kodzie „+” oznacza, że wiersz należy dodać do skryptu FormMail, a „-” – że trzeba go usunąć. W każdym przypadku pokazujemy, gdzie należy dodać lub usunąć wiersze, pokazując sąsiednie wiersze w skrypcie FormMail.

    Najpierw musisz poprosić Perl o użycie modułu LWP::UserAgent, dodając ten wiersz do formularza FormMail:

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

    (W tym celu moduł LWP::UserAgent musi znajdować się w środowisku Perl. Większość instalacji Perl ma już ten moduł. Jeśli nie jest on zainstalowany, zapoznaj się z podstawowymi instrukcjami instalowania modułów Perl.

    Następnie dodaj kod wywołujący funkcję sprawdzania CAPTCHA zdefiniowaną poniżej.

     # 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;
    

    Teraz sprawdź poprawność odpowiedzi CAPTCHA i wygeneruj błąd, jeśli odpowiedź nie będzie zgodna z testem.

     +##############################################################################
     +# 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.                                                   #
    

    Na koniec utwórz funkcję, która wyświetla komunikat o błędzie w przypadku niepowodzenia kontroli:

             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;
     }
    

    To wszystko! reCAPTCHA powinno już działać w Twojej witrynie.

    Dalsza lektura

  • Dostosowywanie wyglądu i stylu
  • Wskazówki i wytyczne
  • Rozwiązywanie problemów