2016-04-18 39 views
1

我有一個形式與多個字段& recaptcha。如果其中一個字段在點擊提交按鈕時無效& recaptcha有效,它將提交表單但驗證這些字段並在用戶失敗時返回錯誤消息。谷歌recaptcha沒有驗證在服務器端第二次

在此階段,驗證碼仍在檢查&在前端驗證。如果用戶在出現錯誤消息的字段上修復問題並重新提交表單,則來自recaptcha的回覆爲false,因此不會進行驗證。

enter image description here

我輸入有效的電子郵件後,我得到這個:

enter image description here

我的功能,它檢查驗證碼是這樣的:

enter image description here

虛假它的結果在上面的屏幕截圖上顯示的錯誤消息。

+0

這不是預期的行爲?我寧願不提交表單(並驗證以及),直到所有條目驗證。 – bugnumber9

回答

2

驗證碼只有一次纔有效。

你有幾個可能的方法:

  • 保存會話變量用戶已經成功完成了驗證碼,不需要它通過驗證的第二次。一定要在成功提交時清除變量,否則攻擊者可以解決一次並提交一百萬次。
  • 重新顯示驗證碼(使用grecaptcha.render調用),並要求它們在表單提交失敗時再次填寫驗證碼。
  • 在首先驗證所有其他字段之前,不要驗證驗證碼。
+0

謝謝你,會那樣做 – GGio

2

從官方docs

如果您的網站進行使用AJAX請求, 你只能驗證一次用戶的驗證碼響應令牌 (G-驗證碼響應)服務器端驗證。如果已使用 特定令牌進行驗證嘗試,則不能再次使用。您需要致電 grecaptcha.reset(),要求最終用戶再次使用reCAPTCHA進行驗證。

這意味着,您的verifyCaptcha()函數只能運行一次。將驗證標誌保存到會話變量中,只需檢查它是否存在並且對每個後續請求都有效。

+0

謝謝你的參考。有意義 – GGio

+0

Upvote for docs鏈接。 – ceejayoz