从Google reCaptcha v2中去除手动挑战

3
v2版本的reCaptcha与以前的版本相比有了一些重大改进。当它首次实现时(使用PHP验证),它只要求我的用户勾选一个框。然后,在提交了几个表单之后,它要求用户识别一些图像,再提交几个表单后,它会要求用户验证多个图像挑战。
有人知道如何完全关闭/禁用谷歌reCaptcha API中的手动图像挑战吗?即我希望他们只检查JS复选框-就像前几次完成表单时一样。
我知道这有点违背初衷,但如果换来更好的用户体验,我愿意忍受一点垃圾邮件。
我尝试过:

我认为谷歌会监视实现并智能地更改UI。在我的情况下,来自同一IP地址的许多请求看起来像是机器人,因此需要更好的验证。然而,这只是一个单一用户多次提交相同表单。我想要做的是覆盖它,始终使用最低安全性。


你不觉得如果我们可以绕过他们的意愿进行验证,这样做就没有太大帮助了吗?... - Julio Soares
1
如果是同一个用户重复提交,那么第一次之后为什么还要向他们提出挑战呢?如果会话是一个问题(在我看来,会话总是一个问题),请参考OWASP的正确会话处理方法,然后在他们的会话中设置一个标志,指示是否应该向他们提出挑战。 - Ghedipunk
2个回答

5
Google的reCaptcha假定每次您向某人发起挑战时,您都怀疑他们是机器人,因此如果他们已经通过了挑战,则下一个挑战将变得更加困难。
因此,只有在您认为他们可能是机器人时(例如,第一次提交表单或者未经过身份验证的用户),才会向某人发起挑战。一旦谷歌告诉您该用户是安全的,请相信他们,除非/直到您有理由再次怀疑该用户。
PHP的$ _SESSION超级全局变量可能是您最好的选择,但与所有会话一样,请确保遵循最佳实践(会话名称指纹识别、令牌熵、会话固定攻击、混合不安全和TLS会话等)。
我处理的方式是,当用户第一次成功通过CAPTCHA挑战时,请勿再对其进行挑战。
以下示例基于谷歌在其示例中提供的代码: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']未设置或为假值,则呈现验证码
  • 如果$_SESSION['isCaptchaVerified']为真值,则不呈现任何验证码
(请参阅PHP手册中关于empty()的条目,了解在此上下文中什么是真值和假值)。

是的 - 这是一个绕过的绝妙想法 - 谢谢! - contool
1
如果我访问这个网站,通过验证码一次性设置我的会话,然后让我的机器人使用这个会话来黑客攻击账户,而不需要经过任何验证码检查,那该怎么办? - NoDisplayName

-1

进入您在 Google 中设置站点的 reCAPTCHA 的管理控制台。单击高级设置,将安全首选项降至最低。

问题已解决


这实际上并不能阻止图像选择的出现。 - Justin Finkelstein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接