2

我之前将 reCAPTCHA V1 与来自 Matt 的 Script Archive 的 FormMail.cgi 结合使用,并使用以下 Perl 函数来验证 reCAPTCHA 响应:

sub check_captcha {

    my $ua = LWP::UserAgent->new();
    my $result=$ua->post(
        'http://www.google.com/recaptcha/api/verify',
        {
            privatekey => 'MyPrivateKey',
            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');
    }
}

reCAPTCHA V1 将于 2018 年 3 月关闭,因此我需要转到reCAPTCHA V2,但是,我无法验证 CGI 脚本中的响应。

根据服务器端文档,这是我迄今为止尝试过的(没有成功):

sub check_captcha {

    my $ua = LWP::UserAgent->new();
    my $result=$ua->post(
        'https://www.google.com/recaptcha/api/siteverify',
        {
            secret     => 'MyPrivateKey',
            remoteip   => $ENV{'REMOTE_ADDR'},
            response   => $Form{'g-recaptcha-response'}
        }
    );
    if ( $result->is_success && $result->content =~ /"success": true/ ) {
        return;
    } else {
        &error('captcha_failed');
    }
}

以上总是分支到“captcha_failed”错误。

提前感谢您抽出宝贵时间阅读我的问题,感谢社区可以提供的任何帮助。

非常感谢!

4

1 回答 1

2

我看不出您的代码有任何明显的问题。但我想知道为什么当Google::reCAPTCHA存在时你要自己实现它。

use Google::reCAPTCHA;

my $c = Google::reCAPTCHA->new( secret => 'MyPrivateKey' );

# Verifying the user's response 
my $success = $c->siteverify(
  response => $Form{'g-recaptcha-response'},
  remoteip => $ENV{'REMOTE_ADDR'},
);

if ( $success ) {
  # CAPTCHA was valid
}

为什么要使用 Matt 的 Script Archive 中的代码?

于 2018-01-02T15:09:29.200 回答