2017-03-18 180 views
0

我正在使用下面的示例在我的網站中構建ReCaptcha。 我想知道如何在客戶端站點和服務器站點驗證這一點。 是否足以驗證用戶是否已選中客戶端的複選框而不檢查服務器站點? 另外,我需要計算用戶未驗證驗證碼的次數。如何驗證客戶端以及服務器端的recaptcha

<html> 
    <head> 
    <title>reCAPTCHA demo: Explicit render after an onload callback</title> 
    <script type="text/javascript"> 
     var onloadCallback = function() { 
     grecaptcha.render('html_element', { 
      'sitekey' : 'your_site_key' 
     }); 
     }; 
    </script> 
    </head> 
    <body> 
    <form action="?" method="POST"> 
     <div id="html_element"></div> 
     <br> 
     <input type="submit" value="Submit"> 
    </form> 
    <script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit" 
     async defer> 
    </script> 
    </body> 
</html> 

回答

0

如果您使用新的不可見的recaptcha,您可以簡單地將它鏈接到您的提交按鈕。你不需要測試用戶是否已經「檢查了複選框」,因爲不會有一個。

總是需要驗證服務器端的recaptcha。聰明的機器人可以在客戶端僞造任何東西。你只是想防止愚蠢的機器人?

recaptcha API不報告嘗試的次數。你只需要在這一個上信任Google。某些「選擇所有圖像」的挑戰不明確,需要多次嘗試纔是正常的。

+0

如何在服務器端驗證ReCaptcha? –

+0

'$ s ='你的祕密'; $ r = $ _POST ['g-recaptcha-response']; $ v = file_get_contents(「https://www.google.com/recaptcha/api/siteverify?secret=$s&response=$r」); echo json_decode($ v) - >成功? '通過':'失敗';' –

0

如何驗證客戶端驗證碼:

既然你是不是通過你的目標HTML元素上的任何數據 - *屬性,你還是要通過他們在grecaptcha.render() API選項參數選項。隨着sitekey您可以通過callback: function() {..}。每次用戶驗證成功時都會調用回調函數,但無法知道用戶驗證驗證提交的次數。

另一種通過使用grecaptcha.getResponse() api以編程方式在客戶端驗證用戶是否已通過驗證的方法。如果此api返回非零長度的字符串標記,則表示用戶已驗證。順便說一句,這個api返回的標記與提交表單時發送給服務器的標記是相同的,需要注意的是,如果您想切換到發佈表單的方式。

如何驗證服務器端驗證碼:

提交的表單應該有一個需要發送到驗證碼驗證服務器,以檢查其有效性g-recaptcha-response POST參數。 Tom已經發布了PHP的方式來驗證它在他的回答中的評論。

我可以只依靠客戶端驗證:

你就是不行。您必須使用recaptcha驗證服務器驗證客戶端發送的令牌。它側JavaScript可以很容易地劫持,以返回假陽性。惡意機器人可以覆蓋recaptcha腳本的api方法並返回自己的值。因此,您必須使用recaptcha驗證服務器檢查客戶端發送的令牌是否有效。