reCaptcha v3 处理分数回调

Posted

技术标签:

【中文标题】reCaptcha v3 处理分数回调【英文标题】:reCaptcha v3 handle score callback 【发布时间】:2019-02-19 09:39:40 【问题描述】:

我关注了recaptcha v3 example,并设法让它返回一个带有页面分数的回调,类似于他们的demo。

我不明白的是如何处理返回的分数。

我明白成功是建立在门槛上的。使用 github 包,后端验证将 json(失败或成功)返回到前端。我应该使用 javascript 在前端处理失败或成功吗?如果浏览器有 javascript 怎么办?禁用?

我正在考虑在所有页面上使用 recaptcha v3,并在一段时间内阻止被认为是机器人的用户。

我正在使用 laravel,但我不知道如何在中间件或其他地方处理验证,以便在用户没有令牌(javascript 已禁用)或被考虑时阻止用户机器人。

【问题讨论】:

大多数人都启用了javascript,您可以使用“我不是机器人”复选框来确定他们是否是机器人——您可以将代码集成到mvc中并且它应该可以运行。只需将代码放在适当的位置即可。 我相信 recaptcha v3 不使用“我不是机器人”复选框。我对禁用的javascript的问题是,如果它被禁用,如果我使用javascript在前端处理成功,机器人可以绕过recaptcha。 你研究过所有的 php 解决方案吗? developers.google.com/recaptcha/old/docs/php 试用 Google reCaptcha 库,例如 ***.com/questions/53582439/recaptcha-v3-cross-browser 试试 reCaptcha 库,见this post 【参考方案1】:

如果 JavaScript 被禁用,reCAPTCHA 无论如何都不起作用,并且如果机器人保护对您至关重要,大多数表单提交将会/应该失败。

至于 V3 返回的分数,完全取决于您如何处理。

这通常在表单验证中处理。使用 V3,您可以要求 g 响应值大于 0.8 或您喜欢的值。确切的实现因应用的结构而异。

来自文档: reCAPTCHA v3 返回一个分数(1.0 很可能是良好的交互,0.0 很可能是机器人)。根据得分,您可以根据您的网站采取不同的行动。

【讨论】:

好的,但是如果分数失败或javascript被禁用,我应该如何阻止表单提交?因为我在前端得到了分数。用javascript处理它是否正确我担心如果我在前端处理它可能会被改变。我的问题是我最终在应用程序的前端得到了一个分数,但我不知道该怎么处理它。 您应该在服务器端验证分数。 (第 3 步:将令牌发送到您的后端并请求验证“) - 在客户端验证令牌是不安全的。 我在后台验证token,但是验证失败不知道怎么处理。在他们的示例中,他们只是将 json 发送回前端,说明验证失败。我想从后端采取一些行动,但他们的脚本需要一个 json 响应,并且应该在前端采取行动。【参考方案2】:

reCAPTCHA 令牌应在服务器端进行验证。首先,将生成的令牌附加到您的表单中:

grecaptcha.ready(function() 
    grecaptcha.execute('env('RECAPTCHA_V3_PUBLIC_KEY')', action: 'contactform').then(function(token) 
        $('<input>').attr(
            type: 'hidden',
            name: 'g-recaptcha-response',
            value: token
        ).prependTo('.contact-form')
    );
);

然后,当您在控制器上捕获输入时,您可以使用自定义表单请求:

<?php

namespace App\Http\Requests;

use App\Rules\RecaptchaV3;
use Illuminate\Foundation\Http\FormRequest;

class ContactFormRequest extends FormRequest

    public function rules()
    
        $rules = [
            'name' => 'required',
            'email' => 'required|email',
            'message' => 'required',
            'g-recaptcha-response' => ['required', new RecaptchaV3],
        ];

        return $rules;
    
...


g-recaptcha-response 字段为required,因此如果用户禁用 JS,他们将在验证表单输入时收到错误。

接下来对于g-recaptcha-response,我们应用自定义验证规则:RecaptchaV3。

这是我的实现:

<?php

namespace App\Rules;

use GuzzleHttp\Client;
use Illuminate\Contracts\Validation\Rule;

class RecaptchaV3 implements Rule

    public function passes($attribute, $value)
    
        $client = new Client();

        $response = $client->post('https://www.google.com/recaptcha/api/siteverify', [
            'form_params' => [
                'secret' => env('RECAPTCHA_V3_PRIVATE_KEY'),
                'response' => $value,
                'remoteip' => $_SERVER['REMOTE_ADDR'],
            ]
        ]);

        $decoded = json_decode($response->getBody());

        return $decoded->success;
    

    public function message()
    
        return "You didn't pass reCAPTCHA challenge!";
    

接下来,在您的控制器中使用上述表单请求:

public function processContactForm(ContactFormRequest $request)

    ...

希望这会有所帮助。

【讨论】:

我最终得到了类似的用途,但我没有使用验证,而是在控制器中使用了if。但我认为您的解决方案可能会更好。 你可以使用github.com/google/recaptcha的recaptcha库来改进验证规则 如何使用RecaptchaV3 类? 您可以像这样在验证中使用它:'g-recaptcha-response' =&gt; ['required', new RecaptchaV3], 在 Marian 的帖子中执行每一步才能正常工作。【参考方案3】:

很遗憾,recaptcha v3 没有挑战方法,这意味着我们需要在自己的服务器端处理分数阈值。

最好的解决方案是同时应用 v2 和 v3,例如如果 v3 未通过阈值,则会弹出 v2 质询。官方网站建议使用 2-way authentication e.g.短信。但是,我不认为 70% 的人会这样做。

我为 Laravel 框架创建了一个支持乐谱设置的作曲家包。可以在githubrecaptcha查看源码:

您可以为自己的分数处理程序进行分数比较。

基本用法如下:

!!  GoogleReCaptchaV3::requireJs() !! 
<form method="POST" action="/verify">
@csrf
!!  GoogleReCaptchaV3::render('contact_us') !!

<input type="submit" value="submit"> </form>

【讨论】:

以上是关于reCaptcha v3 处理分数回调的主要内容,如果未能解决你的问题,请参考以下文章

测试新的Google reCAPTCHA v3

仅当用户是人类(reCaptcha v3)时,如何加载和插入一些 HTML?

如何解决 Google v3 reCaptcha 超时?

如何在服务器端验证 Google reCAPTCHA v3?

reCAPTCHA v3 - 错误:没有reCAPTCHA客户端

Google reCaptcha v3 与 google reCaptcha Enterprise