Какие-нибудь примеры обработки ответа POST на recaptcha?

Текущая версия V2 reCaptcha возвращает "POST" в CGI:params. Не совсем то, что делала старая версия V2.

Положительным моментом является то, что любое содержимое HTML-формы и ответ reCaptcha поступают одновременно. Недостатком является то, что значение "g-recaptcha-response" является BLOB-объектом, который требует локальной проверки.

Значение "g-recaptcha-response" выглядит примерно так:

03AJzQf7OU1j33-wm7I73BItJg-l2COD-YwSjesvfej_5vy5c0r_LUhaDU1KsvU0BV0Rc-MHRbR4L17TNya1CqFtCJGulzvwTpKCfjwWcwqj2e3nFiqeropkXnYzwE78Eydr0jGi3OjZCKK71rmhOXZr0OA_nC8Cpd6aPaexqkrfLXdiXFPE7pQqc-qixYzVklb2MIuPyxw414kVbyHsbDr5p-pitK9cXvvPYK1Td7T_z6xnMUIuNN5zY3ArYzlAGexsSffucQRrzSKT_779In1QzwQppASux3-Z_xPLQgCLnRsJlwcby7gFFWXHSfAxV2ErpsiGWQcGa1

Как можно расшифровать этот ответ в Perl, чтобы убедиться, что это подлинное подтверждение того, что тест Тьюринга был решен правильно?

1 ответ

Знаете ли вы модуль Captcha:: reCAPTCHA:: V2? Я успешно использовал его, и это экономит время. В простом CGI код на стороне сервера, который выполняет проверку, будет выглядеть так:

my $rc = Captcha::reCAPTCHA::V2->new;
my $result = $rc->verify('<your secret key here>', param('g-recaptcha-response'), remote_host);

# Check the result
if( !$result->{success} ){
  # The check failed, ignore the POST
  next;
}

Я предполагаю, что вы уже создали свои ключи reCAPTCHA, у вас есть HTML-форма и представление о том, как создать остальную часть кода на стороне сервера.

Чтобы помочь другим людям, которые могут искать, как это сделать, это минимальная форма для клиентской стороны (она основана на начальной загрузке):

<form id="contact-form" method="post" action="contact">
    <div class="row">
        <div class="col-md-12">
            <div class="form-group">
                <label for="message">Comments</label>
                <textarea id="message" type="text" name="message" class="form-control" placeholder="Your comments..." rows="4" required></textarea>
            </div>
        </div>
    </div>

    <div class="row">
        <div class="col-md-12">
            <div align="center">
                <button
                        class="g-recaptcha"
                        data-sitekey="<your site key here>"
                        data-callback="onSubmit">
                        Enviar mensaje
                </button>
            </div>
        </div>
    </div>
</form>

<script>
  function onSubmit(token) {
    document.getElementById("contact-form").submit();
  }
</script>

Затем на стороне сервера вам понадобится что-то вроде этого (это основано на FastCGI; для CGI вы бы не использовали цикл):

use CGI::Fast qw(:standard);
use Captcha::reCAPTCHA::V2;

...

while(my $query = new CGI::Fast) {

  ...

  if( request_method eq 'POST' ) {

    my $rc = Captcha::reCAPTCHA::V2->new;
    my $result = $rc->verify('<your secret key here>', param('g-recaptcha-response'), remote_host);

    # Check the result
    if( !$result->{success} ){
      # The check failed, ignore the POST
      next;
    }

    # Do something with the form

  }

  ...
}
Другие вопросы по тегам