2016-12-13 54 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