我正在通过一个小清单来升级我已经完成的网络系统部分的内容,其中一个是确保我的Google reCaptcha的安全性是正确的。
目前,我使用此代码:
//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);
这很好用,但是Google的文档说你应该使用POST方法而不是get,显然是为了确保有人不会抓住我的密钥。但是,我不确定如何做到这一点,所以一些指导意见将不胜感激。我知道我可能不得不使用cURL,但是,我不知道它,我不确定如何安装它(如果需要)。
谢谢,汤姆。
答案 0 :(得分:4)
...将变量发布到Google的reCaptcha服务器,而不是通过GET发送。
$Response = file_get_contents($Url."?secret=".$SecretKey."&response=".$_POST['Response']);
不是将数据嵌入到URL中(如上述URL中的密钥和响应)并通过GET发送,如果您想通过HTTP POST将数据发送到Google服务器,那么您必须使用客户端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_RETURNTRANSFER
设置为true
,将转移作为返回值curl_exec()
的字符串返回,而不是直接将其输出。CURLOPT_SSL_VERIFYPEER
可用于验证对等证书。如果我们将其指定为false
,它将接受任何服务器(对等)证书。CURLOPT_POST
用于执行常规HTTP POST。此POST是正常的application/x-www-form-urlencoded
类型,最常用于HTML表单。CURLOPT_POSTFIELDS
用于指定我们要使用此POST请求提交的完整数据。应使用http_build_query()
函数将$data
数组转换为URL编码的查询字符串,以便将其作为application/x-www-form-urlencoded
发送。