【问题标题】:reCAPTCHA V2 with FormMail.cgi (Matt's Script Archive)带有 FormMail.cgi 的 reCAPTCHA V2(Matt 的脚本存档)
【发布时间】:2018-01-02 14:48:58
【问题描述】:

我之前将 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 脚本中的响应。

基于server side documentation,这是我迄今为止尝试过的(没有成功):

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”错误。

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

非常感谢!

【问题讨论】:

  • 您在认真使用 2018 年 Matt's Script Archive 的表单邮件吗?
  • 你打印出回复内容了吗?请求是否成功?你能在你的服务器上安装额外的模块来加载调试工具吗?看看您的脚本与 Google 之间的通信会很有趣。
  • @simbabque 我在这方面非常缺乏经验,Matt 的脚本档案中的 FormMail 是我当时能找到的最佳解决方案。您能否建议一些更适合驱动简单网站联系表的内容?
  • 这真的取决于你有什么样的托管孩子。如果它真的只是一个联系表格,我想 CGI 不是问题。但该代码是OLD。而且您可能没有使用它的所有功能(如果有的话)。 This talk 解释了为什么 CGI 不是当今的最佳选择。但是,如果您使用的是共享主机,则没有很多选择。不过,即使使用 CGI(或在 CGI 上设置 Plack),您也可以编写相对干净、现代的代码。将几个模块、几行代码组合在一起,它会比那些旧东西更好。
  • @simbabque 感谢您提供的信息,感谢您的宝贵时间。我确实在共享主机上,无法在 Web 服务器上安装其他模块。看完你链接的视频后,我不鼓励使用 CGI,但担心我没有选择,因为我的主机。不过,感谢您的建议。

标签: perl cgi recaptcha formmail


【解决方案1】:

我看不出您的代码有任何明显的问题。但是我想知道为什么当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 的脚本存档的代码?

【讨论】:

  • 非常感谢 Dave,我不知道它的存在,因此我非常感谢您朝着正确的方向发展。我在共享主机上,在联系我的主机提供商后,我发现我无法在服务器上安装额外的 Perl 模块。因此,以上仍然是一个可行的选择吗?至于 Matt 的 Script Archive - 我在一般的 Web 开发方面非常缺乏经验,这是我当时能找到的最好的解决方案来推动我的网站联系表格 - 我意识到这并不理想。
  • 好吧,Google::reCAPTCHA 是一个单一的源文件,所以您可以将它复制到服务器上合适的目录中。但它使用Params::Validate,安装起来有点困难。但是,老实说,共享主机并不是尝试运行 Perl 应用程序的好地方。大多数提供者不知道如何提供合理的 Perl 开发环境。如果您想坚持使用 Perl(我鼓励您这样做),那么我建议您寻找一种能够让您安装自己的软件的服务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
相关资源
最近更新 更多