谷歌的验证码将假定每个你挑战一个人的时候,你怀疑他们是一个机器人,所以如果他们已经通过了一项挑战,挑战未来变得越来越难。
因此,只有当你认为他们可能是一个机器人,比如他们第一次提交表单,或者如果他们没有身份验证的网站挑战的人。一旦谷歌告诉您用户是安全的,除非您有理由再次怀疑该用户,否则请相信他们。
超全球可能是您最好的选择,但是与所有会话一样,请确保您遵循最佳实践(会话名指纹,令牌熵,会话修复攻击,混合不安全和TLS会话等)
我会处理这件事的方式是,当用户第一次成功通过验证码验证,不要再挑战他们。
下面的例子是基于谷歌在其提供的示例代码: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']
没有设置或falsey
- 不存在任何挑战,如果
$_SESSION['isCaptchaVerified']
是truish
(请参阅PHP manual entry on empty()
了解在这种情况下什么构成欺骗和虚假)。
难道你不认为如果我们能够绕过他们的愿意验证它会无法提供多少帮助吗?... –
如果用户反复提交的是同一用户,那么为什么还要向他们提出挑战第一次?如果会议是一个问题,请检查OWASP是否有正确的会话处理(并且在我的_opinion_中,会话始终是一个问题),然后在会话中设置一个标志,说明是否应该提供挑战。 – Ghedipunk