谷歌的驗證碼將假定每個你挑戰一個人的時候,你懷疑他們是一個機器人,所以如果他們已經通過了一項挑戰,挑戰未來變得越來越難。
因此,只有當你認爲他們可能是一個機器人,比如他們第一次提交表單,或者如果他們沒有身份驗證的網站挑戰的人。一旦谷歌告訴您用戶是安全的,除非您有理由再次懷疑該用戶,否則請相信他們。
超全球可能是您最好的選擇,但是與所有會話一樣,請確保您遵循最佳實踐(會話名指紋,令牌熵,會話修復攻擊,混合不安全和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