reCaptcha v3 处理分数回调

reCaptcha v3 handle score callback

我关注了recaptcha v3 example and managed to make it return a callback with a score for a page, similar with their demo

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

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

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

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

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

至于V3的分数returns,完全取决于你如何处理。

通常这是在表单验证时处理的。对于 V3,您可以要求 g-response 值大于 0.8 或您喜欢的值。确切的实施方式因应用的结构而异。

来自文档: reCAPTCHA v3 returns 分数(1.0 很可能是良好的交互,0.0 很可能是机器人)。根据分数,您可以在您网站的上下文中采取不同的操作。

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)
{
    ...
}

希望对您有所帮助。

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

最好的解决方案是同时应用 v2 和 v3,例如如果 v3 未达到阈值,则会弹出 v2 挑战。官方网站建议使用双向身份验证,例如短信。但是,我不认为70%的人会这样做。

我为 Laravel 框架创建了一个支持乐谱设置的作曲包。您可以在 github recaptcha:

查看源代码

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

基本用法如下:

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

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