reCaptcha v3 处理分数回调
Posted
技术标签:
【中文标题】reCaptcha v3 处理分数回调【英文标题】:reCaptcha v3 handle score callback 【发布时间】:2019-02-19 09:39:40 【问题描述】:我关注了recaptcha v3 example,并设法让它返回一个带有页面分数的回调,类似于他们的demo。
我不明白的是如何处理返回的分数。
我明白成功是建立在门槛上的。使用 github 包,后端验证将 json(失败或成功)返回到前端。我应该使用 javascript 在前端处理失败或成功吗?如果浏览器有 javascript 怎么办?禁用?
我正在考虑在所有页面上使用 recaptcha v3,并在一段时间内阻止被认为是机器人的用户。
我正在使用 laravel,但我不知道如何在中间件或其他地方处理验证,以便在用户没有令牌(javascript 已禁用)或被考虑时阻止用户机器人。
【问题讨论】:
大多数人都启用了javascript,您可以使用“我不是机器人”复选框来确定他们是否是机器人——您可以将代码集成到mvc中并且它应该可以运行。只需将代码放在适当的位置即可。 我相信 recaptcha v3 不使用“我不是机器人”复选框。我对禁用的javascript的问题是,如果它被禁用,如果我使用javascript在前端处理成功,机器人可以绕过recaptcha。 你研究过所有的 php 解决方案吗? developers.google.com/recaptcha/old/docs/php 试用 Google reCaptcha 库,例如 ***.com/questions/53582439/recaptcha-v3-cross-browser 试试 reCaptcha 库,见this post 【参考方案1】:如果 JavaScript 被禁用,reCAPTCHA 无论如何都不起作用,并且如果机器人保护对您至关重要,大多数表单提交将会/应该失败。
至于 V3 返回的分数,完全取决于您如何处理。
这通常在表单验证中处理。使用 V3,您可以要求 g 响应值大于 0.8 或您喜欢的值。确切的实现因应用的结构而异。
来自文档: reCAPTCHA v3 返回一个分数(1.0 很可能是良好的交互,0.0 很可能是机器人)。根据得分,您可以根据您的网站采取不同的行动。
【讨论】:
好的,但是如果分数失败或javascript被禁用,我应该如何阻止表单提交?因为我在前端得到了分数。用javascript处理它是否正确我担心如果我在前端处理它可能会被改变。我的问题是我最终在应用程序的前端得到了一个分数,但我不知道该怎么处理它。 您应该在服务器端验证分数。 (第 3 步:将令牌发送到您的后端并请求验证“) - 在客户端验证令牌是不安全的。 我在后台验证token,但是验证失败不知道怎么处理。在他们的示例中,他们只是将 json 发送回前端,说明验证失败。我想从后端采取一些行动,但他们的脚本需要一个 json 响应,并且应该在前端采取行动。【参考方案2】: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)
...
希望这会有所帮助。
【讨论】:
我最终得到了类似的用途,但我没有使用验证,而是在控制器中使用了if
。但我认为您的解决方案可能会更好。
你可以使用github.com/google/recaptcha的recaptcha库来改进验证规则
如何使用RecaptchaV3
类?
您可以像这样在验证中使用它:'g-recaptcha-response' => ['required', new RecaptchaV3],
在 Marian 的帖子中执行每一步才能正常工作。【参考方案3】:
很遗憾,recaptcha v3 没有挑战方法,这意味着我们需要在自己的服务器端处理分数阈值。
最好的解决方案是同时应用 v2 和 v3,例如如果 v3 未通过阈值,则会弹出 v2 质询。官方网站建议使用 2-way authentication e.g.短信。但是,我不认为 70% 的人会这样做。
我为 Laravel 框架创建了一个支持乐谱设置的作曲家包。可以在githubrecaptcha查看源码:
您可以为自己的分数处理程序进行分数比较。
基本用法如下:
!! GoogleReCaptchaV3::requireJs() !!
<form method="POST" action="/verify">
@csrf
!! GoogleReCaptchaV3::render('contact_us') !!
<input type="submit" value="submit"> </form>
【讨论】:
以上是关于reCaptcha v3 处理分数回调的主要内容,如果未能解决你的问题,请参考以下文章
仅当用户是人类(reCaptcha v3)时,如何加载和插入一些 HTML?
如何在服务器端验证 Google reCAPTCHA v3?