webentwicklung-frage-antwort-db.com.de

reCaptcha v3 behandelt den Score-Callback

Ich folgte Beispiel recaptcha v3 und konnte einen Callback mit einer Bewertung für eine Seite zurückgeben, ähnlich wie bei demo .

Was ich nicht verstehe, ist der Umgang mit der zurückgegebenen Punktzahl.

Ich verstehe, dass der Erfolg auf der Schwelle basiert. Mit dem github-Paket gibt die Backend-Überprüfung Json (Fail oder Erfolg) an das Frontend zurück .Soll ich den Fail oder Erfolg im Frontend mit Javascript handhaben? Was ist, wenn der Browser das Javascript deaktiviert hat?

Ich habe überlegt, auf allen Seiten das Recaptcha v3 zu verwenden und die Benutzer, die Bots für längere Zeit in Betracht gezogen haben, zu blockieren.

Ich benutze Laravel, aber ich kann nicht herausfinden, wie mit der Überprüfung in der Middleware oder anderswo verfahren werden soll, um die Benutzer zu blockieren, wenn sie keinen Token haben (Javascript ist deaktiviert) oder sie werden als Bots betrachtet.

9
Victordb

das reCAPTCHA-Token sollte serverseitig validiert sein. Fügen Sie das generierte Token zuerst in Ihr Formular ein:

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

Wenn Sie dann die Eingabe auf Ihrem Controller erfassen, können Sie eine benutzerdefinierte Formularanforderung verwenden:

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

}

Das g-recaptcha-response-Feld ist required. Wenn Benutzer JS deaktivieren, erhalten sie einen Fehler, wenn die Formulareingabe überprüft wird.

Als Nächstes wenden wir für g-recaptcha-response eine benutzerdefinierte Validierungsregel an: RecaptchaV3.

Hier ist meine Implementierung:

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

Als nächstes verwenden Sie in Ihrem Controller die obige Formularanforderung:

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

Hoffe das hilft.

2
Marian

Leider gibt es in recaptcha v3 keine Challenge-Methoden, was bedeutet, dass wir den Score-Schwellenwert auf unserer eigenen Serverseite behandeln müssen. 

Die beste Lösung wäre, dass v2 und v3 zusammen angewendet werden, z. Wenn v3 den Schwellenwert nicht erfüllt, wird v2 herausgefordert. Die offizielle Website schlägt vor, die 2-Wege-Authentifizierung zu verwenden, z. SMS. Ich glaube jedoch nicht, dass 70% der Menschen dies tun würden.

Ich habe ein Composer-Paket für das Laravel-Framework erstellt, das Score-Einstellungen unterstützt. Sie können den Quellcode in github recaptcha überprüfen:

Sie können einen Score-Vergleich für Ihren eigenen Score-Handler durchführen.

Die grundlegende Verwendung wäre wie folgt:

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

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

Wenn JavaScript deaktiviert ist, funktioniert reCAPTCHA sowieso nicht und die meisten Formularsendungen werden/sollten fehlschlagen, wenn der Bot-Schutz für Sie wichtig ist.

Was die Bewertung betrifft, die V3 zurückgibt, ist ganz bei Ihnen, wie Sie damit umgehen.

In der Regel wird dies bei Formularvalidierungen vorgenommen. Bei V3 könnte es erforderlich sein, dass der g-Antwortwert größer als 0,8 ist oder etwas, das Ihnen gefällt. Die genaue Implementierung hängt stark davon ab, wie Ihre App strukturiert ist.

Aus den Dokumenten: ReCAPTCHA v3 gibt eine Bewertung zurück (1,0 ist sehr wahrscheinlich eine gute Interaktion, 0,0 ist sehr wahrscheinlich ein Bot). Basierend auf der Bewertung können Sie variable Aktionen im Kontext Ihrer Website durchführen.

0