【问题标题】:reCaptcha GET / POSTreCaptcha GET / POST
【发布时间】:2016-12-13 19:10:29
【问题描述】:

我正在浏览一个小清单,升级我已经完成的网络系统部分的事情,其中​​之一是确保我的 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,但是,我对此一无所知,并且不确定如何安装它(如果需要的话)。

谢谢,汤姆。

【问题讨论】:

  • 将变量发布到 Google 的 reCaptcha 服务器,而不是通过 GET 发送。
  • 但它从不使用$_GET 发送变量,它总是使用$_POST 发送它们。请参阅此处的文档,https://developers.google.com/recaptcha/docs/verify。对了,$_POST['Response']打错了,应该是$_POST['g-recaptcha-response']
  • @RajdeepPaul $_POST['Reponse'] 是正确的,因为它实际上是通过 Ajax 调用检索变量,在该调用中,您不能发布名称中带有“-”的变量。关于 POST,它说发送方法应该是 post,但这是否意味着它会自动从 URL 中删除变量并改为 POST。我有点怀疑,从我使用的代码中,我将变量添加到 URL 中,就好像它是一个 GET 一样。
  • 请编辑您的问题并添加 jQuery/AJAX 代码。从当前的代码中,不清楚您到底想做什么。
  • @RajdeepPaul,很清楚我在问什么。我需要知道如何将变量发布到 Google 的 reCaptcha,仅此而已。正如我在我的问题中明确指出的那样,目前一切正常,但不太可能是安全的,因此除了如何将变量发布到 reCaptcha 之外,建议任何其他“修复”都是毫无意义的。

标签: php curl post recaptcha


【解决方案1】:

... 将变量发布到 Google 的 reCaptcha 服务器,而不是通过 GET 发送。

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

如果您想通过 HTTP POST 将数据发送到 Google 服务器,那么您必须使用客户端 URL,而不是将数据嵌入 URL(如上述 URL 中的密钥和响应)并通过 GET 发送图书馆。

这是参考:

你的服务器端 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 发送。

【讨论】:

  • 数组中 $secret 和 $secretkey 的变量不匹配
猜你喜欢
  • 2010-10-21
  • 2011-06-06
  • 2020-07-07
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多