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>
我关注了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>