我需要验证 Google Invisible reCaptcha 的结果吗

Do I need to verify the result for Google Invisible reCaptcha

我正在按照 this page 上的说明进行操作 实施 不可见的 recaptcha。一切都很好,但我怎么知道它在工作?有没有办法强制false来测试呢?

此外,上面页面上的文档不清楚,但有些地方有额外的代码来验证用户"response"(它是不可见的,所以我不确定这里的响应是什么)- 所以这样做我需要添加额外的后端逻辑来使用不可见的 reCaptcha 结果令牌和我的密钥命中 this 端点?

当用户在不可见的 recaptcha 上点击提交时会发生什么? API to return token 中做了什么?什么是令牌? siteverify api 然后做什么来确定它是一个人?为什么在使用 reCAPTCHA V2(可见点击一次)时不需要额外验证?

经过一些测试,您似乎可以只做前端部分。在 google 确定您是一个人之前不会调用数据回调函数,如果 google 不确定然后它加载 "select which tiles have a thing in them" reCaptcha 以确保。一旦 reCaptcha api 确定它是一个人,数据回调函数就会被触发 - 那时你可以做进一步的验证以确保你在回调期间收到的令牌是 google实际上已发送,而不是机器人试图通过点击回调函数来愚弄您 - 因此您可以从那里进行服务器端处理以进行进一步验证。下面是 C# ashx 处理程序的示例 - 和 ajax 用于验证

function onTestSubmit(token) {  
        $.ajax({
            type: "POST",
            url: "testHandler.ashx",
            data: { token: token },
            success: function (response) {
                if (response == "True") {
                    //do stuff to submit form
                }
            }
        });            
    }

还有 ashx

    public class testHandler : IHttpHandler {

    public void ProcessRequest (HttpContext context) {
        context.Response.ContentType = "text/plain";
        string token = context.Request.Form["token"];
        bool isCaptchaValid = ReCaptcha.Validate(token);

        context.Response.Write(isCaptchaValid.ToString());
    }


    public bool IsReusable {
        get {
            return false;
        }
    }

    }

    public class ReCaptcha
    {
        private static string URL = 
    "https://www.google.com/recaptcha/api/siteverify?secret={0}&response={1}";
        private static string SECRET = "shhhhhhhhhhhhhhSecretTOken"; 

        public bool Success { get; set; }
        public List<string> ErrorCodes { get; set; }

        public static bool Validate(string encodedResponse)
        {
        if (string.IsNullOrEmpty(encodedResponse)) return false;
        var client = new System.Net.WebClient();
        var googleReply = client.DownloadString(string.Format(URL, SECRET, encodedResponse));
        var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
        var reCaptcha = serializer.Deserialize<ReCaptcha>(googleReply);
        return reCaptcha.Success;
    }
}

是的,你知道。 您需要了解,不可见的 reCaptcha 是一个包含多个步骤的过程,所有这些步骤最终都会提供有关用户人性的最终响应。

简而言之,当用户提交表单(或做任何您试图使用 Invisible reCaptcha 使机器人远离的事情)时,您会将 public 站点密钥发送到您的后端,这将启动一个验证负载到 Google。

在我最基本的示例中,这是希望人类访问者单击以在我的网站上提交表单的按钮:

<button type="submit" class="g-recaptcha" data-sitekey="xxxxxxxx_obscured_xxxxxxxx" data-callback="onSubmit">Submit Form</button>

请注意按钮如何具有数据回调 "onSubmit",在提交时运行这个小脚本:

 <script type="text/javascript">
  var onSubmit = function(response) {
    document.getElementById("simpleForm").submit(); // send response to your backend service
  };
</script>

我的示例中的后端服务是一个普通的 PHP 脚本,用于处理表单输入并将其存储在数据库中,这里是棘手的部分。作为后端 POST 的一部分,除了用户填写的表单字段外,还有来自服务的响应(并且由于您可能会或可能不会在用户可以操作的前端做很多事情post 发送到后端之前的响应,Google 的响应此时不明确)

在您的后端,您需要使用您的 将来自 google 和 post 的 g-recaptcha-response 用于验证 API private key(不是表格上的那个)以获得您可以采取行动的 human/robot 判决。这是一个用 PHP 编写并使用 cURL 命中 API 的简单示例:

$recaptcha_response = $_POST["g-recaptcha-response"];    
    $api_url = 'https://www.google.com/recaptcha/api/siteverify';
    $api_secret = 'zzzzzzz_OBSCURED_SECRET_KEY_zzzzzzzzzzz';
    $remoteip = '';

    $data = array('secret' => $api_secret, 'response' => $recaptcha_response);
    $options = array(
        'http' => array(
            'header' => "Content-type: application/x-www-form-urlencoded\r\n",
            'method' => 'POST',
            'content' => http_build_query($data)
        )
    );

    $context  = stream_context_create($options);
    $result = file_get_contents($api_url, false, $context);

    $captcha_response = json_decode($result, true);

    // at this point I have the definite verdict from google. Should I keep processing the form?.
    if ($captcha_response['success'] == true) {
      // I heart you, human. Keep going
      $captcha_error = 0;
    }

    else {
      // Damn robot, die a slow and painful death
      $captcha_error = 1;
    }

我根据$captcha_error做最后的决定(基本上1表示停止,0表示继续处理)

如果您完全依赖于获得 g-recaptcha-response,那么您会 Google 完成工作然后忽略结果