将Google reCaptcha集成到现有的付款表单中

时间:2014-11-25 11:58:52

标签: php forms captcha recaptcha

最近我的网站通过我的付款表格收到了大量垃圾邮件,我已经决定添加captcha以防止这种情况发生。

我正在考虑几个选项,我决定选择Googles reCaptcha。设置和使用似乎很容易,但我遇到了一些问题。

首先,我已将此script包含在表单的标题中:

<script src='https://www.google.com/recaptcha/api.js'></script>

然后我在表格的底部包含了实际captcha本身:

<div class="g-recaptcha" data-sitekey="6LdOVv4SAAAAAJ4muJvo_vD7vsd9T9QIfkEwcO7y"></div>

当我提交表格时,我会执行以下操作:

$captcha = $_POST["g-recaptcha-response"]; //Get Captcha token
$secret_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; //Get Secret key
$google_response = http_get("https://www.google.com/recaptcha/api/siteverify", array("secret"=>$secret, "response"=>$captcha), $info); //perform Get request
print_r($info);

但是没有任何事情发生,实际上以前工作的页面只是挂起而且甚至不显示错误信息。我有什么想法可能做错了吗?根据我对文档的理解,响应将在JSON中,成功将为真或假,如果为真,我想继续付款或停止并返回表单(如果为false)。

非常感谢任何帮助。或者如果有人有替代解决方案来添加验证码,我愿意考虑一下。

2 个答案:

答案 0 :(得分:12)

尝试运行google new recaptcha 2015:

==PHP Verification==
if(isset($_POST['submit'])){
    $userIP = $_SERVER["REMOTE_ADDR"];
    $recaptchaResponse = $_POST['g-recaptcha-response'];
    $secretKey = "SECRET_KEY";
    $request = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret={$secretKey}&response={$recaptchaResponse}&remoteip={$userIP}");

    if(!strstr($request, "true")){
        echo "NOPE (Failed Verification)";
    }
    else{
        echo "YUP (Successful Verification)";
    }
}

答案 1 :(得分:8)

请勿使用file_get_contents。 Google recommends to use POST-Requests来调用他们的api。如上所述的GET请求可能会导致多个问题:

  • 由于安全性(allow_url_fopen)
  • ,可能会阻止调用网址
  • 用户可能会传递someToken&amp; secret = otherSitesSecret之类的内容作为$ _POST [g-recaptcha-response]的输入。如果你只是将concat串起来调用url,你会将另一个秘密传递给Google。然后,用户可以通过从任何站点获得的任何重新回复来验证自己。这是一个安全问题。
  • Google返回的令牌可能会很长。 Web服务器仅在URL中支持几千个字符。这可能导致字符串被切断,您将收到有效输入的错误。

因此,使用类似

的内容
// Get resource
$curl = curl_init();

// Configure options, incl. post-variables to send.
curl_setopt_array($curl, array(
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_URL => 'https://www.google.com/recaptcha/api/siteverify',
    CURLOPT_POST => 1,
    CURLOPT_POSTFIELDS => array(
        'secret' => 'your_secret_code_here',
        'response' => $_POST['g-recaptcha-response']
    )
));

// Send request. Due to CURLOPT_RETURNTRANSFER, this will return reply as string.
$resp = curl_exec($curl);

// Free resources.
curl_close($curl);

// Validate response
if(strpos($resp, '"success": true') !== FALSE) {
    echo "Verified.";
} else {
    echo "Not verified.";
}

此外,验证部分在接受“验证”的内容时更为保守。