Использование reCAPTCHA с FormMail

Важно : версия 1.0 API reCAPTCHA больше не поддерживается, обновите ее до версии 2.0. Узнать больше

Здесь мы объясним, как добавить reCAPTCHA в ваш скрипт FormMail без использования Perl-модуля reCAPTCHA. Если вы знаете, что делаете, вы также можете использовать Perl-модуль reCAPTCHA.

Клиентская часть (Как сделать так, чтобы изображение CAPTCHA отображалось)

На вашей HTML-странице внутри элемента <form> необходимо добавить следующий код:

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

Наверное, это само собой разумеется, но мы все равно скажем: вам нужно заменить два экземпляра your_public_key на открытый ключ, который вы получили в процессе создания учетной записи. Будьте осторожны, чтобы не использовать свой закрытый ключ по ошибке.

По сути, это добавит два параметра, которые передаются в formmail.cgi (или FormMail.pl) через запрос POST, а именно:

  • recaptcha_challenge_field : это вызов, созданный с помощью вашего открытого ключа.
  • recaptcha_response_field : это отправленный пользователем ответ на вызов, указанный выше.
  • Серверная часть (Как проверить, ввел ли пользователь правильный ответ)

    Затем вам необходимо изменить formmail.cgi (или FormMail.pl) для обработки этих двух параметров и проверки запроса от серверов reCAPTCHA. На этом этапе, вероятно, будет хорошей идеей на всякий случай сделать резервную копию вашего FormMail.pl. В приведенном ниже коде «+» означает, что строку необходимо добавить в скрипт FormMail, а «-» означает, что строку необходимо удалить из него. В каждом случае мы показываем, где строки необходимо добавить или удалить, показывая соседние строки в скрипте FormMail.

    Во-первых, вам нужно указать Perl использовать модуль LWP::UserAgent, добавив в FormMail следующую строку:

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

    (Для этого потребуется, чтобы модуль LWP::UserAgent находился в вашей среде Perl. В большинстве установок Perl этот модуль уже есть. Если модуль не установлен, вот несколько основных инструкций по установке модулей Perl .)

    Затем добавьте код для вызова функции проверки 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;
    

    Теперь проверьте ответ CAPTCHA и сгенерируйте ошибку, если ответ не соответствует запросу.

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

    Наконец, создайте функцию, которая печатает сообщение об ошибке в случае неудачной проверки:

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

    Вот и все! reCAPTCHA теперь должна работать на вашем сайте.

    Дальнейшее чтение

  • Настройка внешнего вида
  • Советы и рекомендации
  • Поиск неисправностей