Ważne: interfejs API reCAPTCHA w wersji 1.0 nie jest już obsługiwany, uaktualnij go do wersji 2.0. Więcej informacji
Wyjaśnimy, jak dodać reCAPTCHA do skryptu FormMail bez korzystania z metody Moduł reCAPTCHA Perl. Jeśli wiesz, co robisz, możesz użyć reCAPTCHA Moduł Perl.
Po stronie klienta (jak wyświetlić obraz CAPTCHA)
Na stronie HTML w elemencie <form> 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>
Raczej nie jest to oczywiste, ale zostanie też wyraźnie wskazane: trzeba zastąpić te dwa obiekty.
wystąpienia your_public_key
z otrzymanym kluczem publicznym
podczas tworzenia konta. Upewnij się, że nie używasz danych prywatnych,
przez pomyłkę.
Spowoduje to dodanie dwóch parametrów, które są przekazywane do formmail.cgi (lub FormMail.pl). za pomocą żądania POST, czyli:
Po stronie serwera (jak sprawdzić, czy użytkownik podał prawidłową odpowiedź)
Następnie musisz zmodyfikować plik formmail.cgi (lub FormMail.pl), tak aby obsługiwał te dwa parametry oraz zweryfikować test zabezpieczający logowanie na serwerach reCAPTCHA. W tym momencie warto utworzyć kopię zapasową usługi FormMail.pl na wszelki wypadek. W poniższym kodzie „+” oznacza, że linia należy dodać do skryptu FormMail oraz znak „-” oznacza, że ten wiersz musi zostać z niego usunięty. W każdym przypadku pokazujemy, gdzie trzeba dodać lub usunąć linie, pokazując sąsiednie w skrypcie FormMail.
Najpierw musisz wskazać platformie Perl, aby używała modułu LWP::UserAgent, dodając następujący wiersz: do FormMail:
# ACCESS CONTROL FIX: Peter D. Thompson Yezek # # http://www.securityfocus.com/archive/1/62033 # ############################################################################## +use LWP::UserAgent; +
(wymaga to modułu LWP::UserAgent. w środowisku Perl. W większości instalacji Perl jest już ten moduł. Na wypadek Moduł nie jest zainstalowany, zapoznaj się z tymi podstawowymi instrukcjami dotyczącymi instalowania języka Perl ).
Następnie dodaj kod wywołujący zdefiniowaną poniżej funkcję testu CAPTCHA.
# 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;
Sprawdź teraz poprawność odpowiedzi CAPTCHA i wygeneruj błąd, jeśli nie będzie do wyzwania.
+############################################################################## +# 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 sprawdzania niepowodzenie:
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 powinien już działać w Twojej witrynie.