19

背景:我的网站非常简单,包含一个带有链接列表的主页(由 3rd 方服务提供) - 每个链接都会弹出一个带有提交按钮的文件上传输入。在那个弹出窗口中,我嵌入了 Recaptcha 脚本,并在文件提交时验证了令牌。由于这种多重弹出设置,我选择了 V3 来实现与验证机制的零用户交互。

现在,一个问题出现了——我应该如何解释谷歌对谷歌的回应。

V3 的谷歌文档说:

reCAPTCHA 通过查看您网站上的真实流量来学习。因此,暂存环境中或实施后不久的分数可能与生产环境不同。由于 reCAPTCHA v3 永远不会中断用户流,因此您可以先运行 reCAPTCHA 而无需采取任何措施,然后通过在管理控制台中查看您的流量来决定阈值。默认情况下,您可以使用阈值 0.5。

从这个描述中我很清楚,这才score是最重要的——0.0 代表最有可能的机器人,1.0 代表最有可能的人类。所以在我的代码中,我检查success == truescore >= 0.5

但是 -我在网上找到的用于服务器端验证的 V3 示例都没有关注分数。这里有 3 个。这三个只检查请求是否成功:

https://stackoverflow.com/a/54118106/3367818

https://stackoverflow.com/a/52633797/3367818

https://dzone.com/articles/adding-google-recaptcha-v3-to-your-laravel-app

最后,我的问题是——这是对 V3 机制的误解,还是我遗漏了什么?

谢谢。

4

2 回答 2

21

是的,您绝对应该在 Google 的验证响应中检查“分数”的值。

这三个例子非常缺乏细节,实际上相当混乱。

“成功”仅仅意味着您使用正确的令牌和秘密发送了格式良好的请求。

听起来您已经在检查“分数”的值,所以这很好,但我只是想为任何发现这个问题并且仍然有点困惑的人澄清这一点。

于 2019-07-23T14:11:39.007 回答
1

为了补充@BrettM的答案......

这取决于处理验证的方式。

使用reCAPTCHA PHP 客户端库

请参阅代码行ReCaptcha::verify() line180-182

  • 设置阈值时:
    $recaptcha = new Recaptcha($secret);
    $response = $recaptcha
            ->setExpectedHostname($hostname)
            ->setExpectedAction($action)
            ->setScoreThreshold(.5)
            ->verify($token, $ip);
    
    $response->isSuccess()false未达到阈值时将返回。
    $response->getErrors()将包含E_SCORE_THRESHOLD_NOT_MET
  • 不设置阈值:
    $response->isSuccess()将返回true,除非有错误。
    $response->getScore()现在应该检查。

不使用 reCAPTCHA PHP 客户端库:

$response['success'] 和 $response['score'] 都应该被检查。

于 2022-01-01T11:40:53.610 回答