2016-12-13 56 views
2

我會通過我的網絡系統的部分小清單升級的事情,我已經做了,其中之一就是確保我的谷歌驗證碼的安全性是正確的。驗證碼GET/POST

目前,我用這個代碼:

//reCaptcha 
$Url = "https://www.google.com/recaptcha/api/siteverify"; 
$SecretKey = "----Secret Key----"; 
$Response = file_get_contents($Url."?secret=".$SecretKey."&response=".$_POST['Response']); 
$Robot = json_decode($Response); 

這工作得很好,但是谷歌的文檔說,你應該使用POST方法,而不是得到的,顯然是爲了確保有人不把我的祕密密鑰的保持。我不確定如何做到這一點,但是,所以一些指導將不勝感激。我知道我可能必須使用cURL,但是,我不知道它,並且我不確定如何安裝它(如果需要的話)。

謝謝,湯姆。

+0

你的問題是什麼呢? * ....我不確定如何做到這一點*,做什麼? –

+0

將變量發佈到Google的reCaptcha服務器,而不是通過GET發送它們。 –

+0

但它永遠不會使用'$ _GET'發送變量,它總是使用'$ _POST'發送它們。在這裏看到的文件,[https://developers.google.com/recaptcha/docs/verify](https://developers.google.com/recaptcha/docs/verify)。順便說一句,'$ _POST ['Response']'是錯誤的,它應該是'$ _POST ['g-recaptcha-response']'。 –

回答

3

...將變量發佈到Google的reCaptcha服務器,而不是通過GET發送它們。

$Response = file_get_contents($Url."?secret=".$SecretKey."&response=".$_POST['Response']); 

而不是在URL(如密鑰,並在上面URL的響應)嵌入的數據,並通過GET發送時,如果要通過HTTP POST將數據發送給谷歌服務器則你必須使用客戶端URL庫。

這裏的參考:

你的服務器端的PHP代碼應該是這樣的:

$Url = "https://www.google.com/recaptcha/api/siteverify"; 
$SecretKey = "----Secret Key----"; 
if(isset($_POST['Response']) && !empty($_POST['Response'])){ 
    //get verified response data 
    $data = array('secret' => $secret, 'response' => $_POST['Response']); 

    $ch = curl_init($Url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
    curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); 
    $verifyResponse = curl_exec($ch); 
    curl_close($ch); 

    $responseData = json_decode($verifyResponse); 

    // your code 

}else{ 
    echo "Please click on the reCAPTCHA box."; 
} 

有幾點,這裏要注意,

  • 設置CURLOPT_RETURNTRANSFERtrue返回轉移作爲curl_exec()返回值的字符串,而不是直接輸出出來的。
  • CURLOPT_SSL_VERIFYPEER可以用來驗證對方的證書。如果我們將其指定爲false,它將接受任何服務器(對等)證書。
  • CURLOPT_POST是用來做常規HTTP POST。此POST是正常的application/x-www-form-urlencoded種,最常用的HTML表單。
  • CURLOPT_POSTFIELDS是用來指定我們希望與該POST請求提交完整的數據。所述$data數組應該使用http_build_query()函數轉換爲URL編碼的查詢字符串,以便它可以作爲application/x-www-form-urlencoded發送。
+0

數組中$ secret的變量不匹配和$ secretkey – Asuquo12