web-dev-qa-db-ja.com

reCaptcha v3ハンドルスコアコールバック

recaptcha v3の例 に従い、 demo と同様に、ページのスコアを含むコールバックを返すようにしました。

私が理解していないのは、返されるスコアの処理方法です

成功はしきい値に基づいていることを理解しています。 githubパッケージを使用すると、バックエンド検証はjson(失敗または成功)をフロントエンドに返します。フロントエンドでjavascriptを使用して失敗または成功を処理することになっていますか? JavaScriptが無効になっていますか?

すべてのページでrecaptcha v3を使用し、ボットと見なされるユーザーをしばらくブロックすることを考えていました。

私はlaravelを使用していますが、トークンを持っていないユーザーをブロックするために、ミドルウェアまたは他の場所で検証を処理する方法を見つけることができません(javascriptは無効)またはボットと見なされます。

10
Victordb

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

お役に立てれば。

2
Marian

残念ながら、recaptcha v3にはチャレンジメソッドがありません。つまり、独自のサーバー側でスコアのしきい値を処理する必要があります。

最善の解決策は、v2とv3の両方を一緒に適用することです。 v3がしきい値に失敗すると、v2チャレンジがポップアップ表示されます。公式サイトでは、双方向認証の使用を提案しています。 SMS。しかし、70%の人がそうするとは思わない。

composer=のパッケージを作成しました。Laravelスコア設定をサポートするフレームワーク。ソースコードはgithub recaptcha で確認できます。

独自のスコアハンドラーのスコア比較を行うことができます。

基本的な使用方法は次のとおりです。

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

<input type="submit" value="submit"> </form>
1
DA DENG

JavaScriptが無効になっている場合、reCAPTCHAはとにかく機能せず、ボット保護が重要な場合、ほとんどのフォーム送信は失敗します。

V3が返すスコアに関しては、完全にあなた次第です

通常、これはフォームの検証で処理されます。 V3では、g応答値を0.8以上にするか、お好みに合わせて変更する必要があります。正確な実装は、アプリの構造によって大きく異なります。

ドキュメントから: reCAPTCHA v3はスコアを返します(1.0は良いインタラクションである可能性が高く、0.0はボットである可能性が高い)。スコアに基づいて、サイトのコンテキストで可変アクションを実行できます。

0