Recaptcha文档不清楚 - 并且跨站点错误测试它

时间:2014-11-25 17:37:03

标签: recaptcha

任何人都可以帮我清楚一下recaptcha文档的最后一页是什么,我发现它非常钝。

这是我无法理解的文档:

  

验证用户的回复

     

此页面介绍了如何验证用户对reCAPTCHA的响应   从您的应用程序的后端挑战。当reCAPTCHA解决时   最终用户将填充一个新字段(g-recaptcha-response)   HTML。您可以通过以下三种方式之一验证用户的响应:

     当用户提交表单时,

g-recaptcha-response POST参数   你的网站。   用户之后的grecaptcha.getResponse(opt_widget_id)   完成CAPTCHA挑战。   如果在g-recaptcha标记中指定了数据回调,则作为回调函数的字符串参数   属性或grecaptcha.render方法中的回调参数

     

API请求

     

URL:   https://www.google.com/recaptcha/api/siteverify?secret=your_secret&response=response_string&remoteip=user_ip_address

我该如何'验证'?

它说我有三种方法可以“验证用户的响应”,所以让我们来看看第一个: 现在提交的表单中有一个名为g-recaptcha-response的POST参数,其中包含一些gobbledygook内容。我的问题是:现在怎样?我只是检查它不是空的吗?

或者我是否可以使用下面提到的API请求将其发送到谷歌,然后检查他们的回复?这可能是有道理的,但如果文档拼写出来会很好,而只是说“API请求”。如果他们拼写出response_string(可能是)g-recaptcha-response参数的内容,那也不错。

显然,我的昂贵教育费用不够昂贵,请有人确认我应该做的API申请让我高枕无忧。


这让我想到了第二个问题:您可以测试recaptcha小部件在本地计算机上运行正常,但您无法测试'API请求' - 我收到跨站点错误

  

XMLHttpRequest无法加载https://www.google.com/recaptcha/api/siteverify。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,不允许原点“http://localhost”访问。

有人知道解决这个问题的方法,以便你可以进行测试吗?

2 个答案:

答案 0 :(得分:8)

也许这篇文章会有所帮助,因为它会显示来自后端和前端预测的确切代码段:

http://www.codedodle.com/2014/12/google-new-recaptcha-using-javascript.html

Php代码:

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Construct the Google verification API request link.
    $params = array();
    $params['secret'] = 'Your secret key here.'; // Secret key
    if (!empty($_POST) && isset($_POST['g-recaptcha-response'])) {
        $params['response'] = urlencode($_POST['g-recaptcha-response']);
    }
    $params['remoteip'] = $_SERVER['REMOTE_ADDR'];

    $params_string = http_build_query($params);
    $requestURL = 'https://www.google.com/recaptcha/api/siteverify?' . $params_string;

    // Get cURL resource
    $curl = curl_init();

    // Set some options
    curl_setopt_array($curl, array(
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_URL => $requestURL,
    ));

    // Send the request
    $response = curl_exec($curl);
    // Close request to clear up some resources
    curl_close($curl);

    $response = @json_decode($response, true);

    if ($response["success"] == true) {
        echo '<h3 class="alert alert-success">Login Successful</h3>';
    } else {
        echo '<h3 class="alert alert-danger">Login failed</h3>';
    }
}

答案 1 :(得分:5)

根据您的说法,您的主要问题似乎是您在用户的浏览器而不是服务器上验证用户的响应。这是真的吗?

只是为了澄清,会发生什么......

  • 您在客户端表单中显示recaptcha小部件。
  • 用户填写。
  • 小部件会做一些聪明的事情,而您的客户端现在有一个response_string,您可以在表单中找到字段g-recaptcha-response(您也可以使用他们提到的其他两种javascript方法获取它)。
  • 当用户提交表单时,请确保服务器收到response_string以及所有其他表单数据。
  • 在服务器上,您必须向https://www.google.com/recaptcha/api/siteverify发出请求。如何执行此操作取决于您在服务器上使用的语言。应该很容易。你会得到一个回复​​,说明用户是否正确使用了验证码。