web-dev-qa-db-fra.com

reCaptcha v3 gérer le rappel du score

J'ai suivi exemple avec recaptcha v3 et j'ai réussi à lui faire renvoyer un rappel avec un score pour une page, similaire avec leur démo .

Ce que je ne comprends pas, c'est comment gérer le score renvoyé.

Je comprends que le succès est basé sur le seuil. En utilisant le paquet github, la vérification de l’arrière-plan renvoie json (échec ou succès) à l’interface client .Suis-je censé gérer l’échec ou le succès en utilisant le javascript? Que faire si le javascript est désactivé sur le navigateur?

Je pensais utiliser recaptcha v3 sur toutes les pages et bloquer les utilisateurs considérés comme des bots pendant un certain temps.

J'utilise laravel mais je n'arrive pas à comprendre comment gérer la vérification dans le middleware, ou ailleurs, afin de bloquer les utilisateurs s'ils ne possèdent pas de jeton (javascript est désactivé) ou s'ils sont considérés comme des bots.

9
Victordb

le jeton reCAPTCHA doit être validé côté serveur. Tout d’abord, attachez le jeton généré à votre formulaire:

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')
    });
});

Ensuite, lorsque vous capturez l’entrée sur votre contrôleur, vous pouvez utiliser une demande de formulaire personnalisée:

<?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;
    }
...

}

Le champ g-recaptcha-response est required donc si les utilisateurs désactivent JS, ils obtiendront une erreur lors de la validation de la saisie de formulaire.

Suivant pour g-recaptcha-response nous appliquons une règle de validation personnalisée: RecaptchaV3.

Voici ma mise en œuvre:

<?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!";
    }
}

Ensuite, dans votre contrôleur, utilisez la demande de formulaire ci-dessus:

public function processContactForm(ContactFormRequest $request)
{
    ...
}

J'espère que cela t'aides.

2
Marian

Malheureusement, recaptcha v3 n’a pas de méthode de challenge, ce qui signifie que nous devons gérer le seuil de score sur notre propre serveur. 

La meilleure solution serait d’appliquer ensemble les versions v2 et v3, par exemple. si la v3 échoue au seuil, alors la v2 apparaît. Le site officiel suggère d’utiliser une authentification bidirectionnelle, par exemple. SMS. Cependant, je ne pense pas que 70% des gens le feraient.

J'ai créé un package composer pour le framework Laravel qui prend en charge les paramètres de partition. Vous pouvez vérifier le code source dans github recaptcha :

Vous pouvez comparer les scores de votre propre gestionnaire de scores.

L'utilisation de base serait comme:

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

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