我是否需要验证Google Invisible reCaptcha的结果

时间:2017-09-22 21:25:37

标签: recaptcha verification invisible-recaptcha

我按照this page上的说明操作 实施隐形recaptcha 。一切都很好,但我怎么知道它有效?有没有办法强迫假测试它?

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

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

2 个答案:

答案 0 :(得分:1)

经过一些测试,看起来你可以做前端部分。数据回调函数不会被调用,直到谷歌确定你是一个人,如果谷歌不确定然后它加载“选择哪些瓷砖有一个东西”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;
    }
}

答案 1 :(得分:1)

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

简而言之,当用户提交表单时(或者您试图通过Invisible reCaptcha使机器人远离),您将向您的后端发送公共站点密钥,这将触发验证有效载荷去谷歌。

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

<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的一部分,用户填写的表单字段之外是服务的响应(并且由于您可能会或可能不会在前端做很多事情,因此用户可以在响应之前对其进行操作发布到您的后端,Google的回应目前尚不明确)

在您的后端,您需要获取来自Google的g-recaptcha-response,然后使用您的私钥(不是表单上的私钥)将其发送到验证API。为了得到您可以采取行动的人/机器人裁决。这是一个用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完成工作,然后忽略结果