从google reCaptcha v2中删除手动挑战


Remove manual challenge from google reCaptcha v2

v2验证码与以前的迭代相比有一些显著的改进。当第一次实现时(顺便说一句,使用PHP验证),它要求我的用户勾选一个框。在几次表单提交之后,它要求用户识别一些图像,然后在几次表单提交之后,它要求用户验证多个图像挑战。

有没有人知道一种方法来完全关闭/禁用手动图像挑战在谷歌recaptcha API?也就是说,我希望他们只选中JS复选框-就像前几次表单完成一样。

我知道这有点违背目的,但我准备处理一点垃圾邮件,如果交易更好的用户体验。

我试过:

  • 通过添加https://www.google.com/recaptcha/api.js?manual_challenge=false(从一些旧的API设置中挖出一行)来关闭js
  • https://www.google.com/recaptcha/api.js?fallback=false(选项'true'只强制使用非JS版本)
  • https://www.google.com/recaptcha/api.js?data-type=none(在黑暗中拍摄基于他们的显示选项)

我假设google监视实现并智能地更改UI。在我的实例中,来自同一IP地址的许多请求看起来像机器人,因此需要更好的验证。然而,它只是一个用户多次重新提交相同的表单。我想做的是重写它,使用最低安全性。

Google的reCaptcha假设每次你挑战某人时,你都怀疑他们是机器人,所以如果他们已经通过了一个挑战,那么下一个挑战就会变得越来越难。

因此,只有当您认为某人可能是机器人时,例如他们第一次提交表单,或者他们没有在您的站点进行身份验证时,才向他们提出质疑。一旦Google告诉你用户是安全的,相信他们,除非/直到你有理由再次怀疑这个用户。

PHP $_SESSION超全局可能是您最好的选择,但与所有会话一样,请确保您遵循最佳实践(会话名称指纹,令牌熵,会话固定攻击,混合不安全和TLS会话等)

我处理它的方式是,当用户第一次成功通过CAPTCHA挑战时,不要再挑战他们。

下面的示例是基于Google提供的示例代码:https://github.com/google/recaptcha/blob/master/examples/example-captcha.php

<?php
if (empty($_SESSION['isCaptchaVerified'])) {
    $recaptcha = new 'ReCaptcha'ReCaptcha($secret);
    $resp = $recaptcha->verify($gRecaptchaResponse, $remoteIp);
    if ($resp->isSuccess()) {
        // verified!
        $_SESSION['isCaptchaVerified'] = true;
    } else {
        $errors = $resp->getErrorCodes();
    }
}
...
?>
<form action="/" method="post">
    ...
    <?php if (empty($_SESSION['isCaptchaVerified'])) { ?>
        <script type="text/javascript"
            src="https://www.google.com/recaptcha/api.js?hl=<?php echo $lang; ?>">
        </script>
    <?php } ?>
</form>

这将:

  • 检查用户是否在
  • 之前通过了质询
  • $_SESSION['isCaptchaVerified']未设置或false时显示挑战
  • 如果$_SESSION['isCaptchaVerified']是真实的,则不存在任何挑战

(参见empty()的PHP手册条目,了解在此上下文中什么构成真和假)。

转到您在谷歌的管理控制台,在那里您设置了站点的recaptcha。单击高级设置,将安全偏好降低到最小。解决了