Google reCAPTCHA响应成功:false,没有错误代码

时间:2017-04-28 10:41:48

标签: asp.net .net asp.net-mvc recaptcha

更新:Google有recently updated their error message,可能还有其他错误代码:"超时或重复"。

这个新的错误代码似乎涵盖了我们之前提到的神秘的99% 例。

我们仍然想知道为什么我们会得到那么多超时或重复的验证请求。确定地确定这一点可能是不可能的,但现在我只是希望其他人经历过这样的事情。

免责声明:我发布了这个to Google Groups,所以请为那些经常访问这两个网站的人发送垃圾邮件而道歉。

我目前正在使用一个使用reCAPTCHA验证的表单作为ASP.Net MVC应用程序的一部分处理页面。该页面目前有许多每日用户。 在我的服务器端验证** reCAPTCHA响应,暂时,我已经看到reCAPTCHA响应的情况,其成功属性设置为false,但附带一个空的错误代码数组。 大多数请求都通过了验证,但有些会继续展示这种模式。

因此,在网上进行一些研究之后,我探讨了我能想到的两种可能情景:

  1. 验证已超时且不再有效。
  2. 用户已使用响应值进行了验证,因此第二次被拒绝。
  3. 收集数据一段时间后,我发现所有情况都是"成功:错误,错误代码:[]"要么验证是相当旧的(从5分钟到10天(!)),要么是重复使用的响应值,或者有时是两者的组合。 即使在实现客户端防止双击我的提交表单按钮之后,许多双重提交仍然似乎通过服务器端谷歌reCAPTCHA验证逻辑。

    我的数据告诉我,所有请求(1760)中有1.6%(28)失败,至少有一个上述情况为真("超时"或"双提交" )。 同时,在错误代码数组不为空的情况下,1760的单个请求没有失败。

    我很难想象一个实际的用例,其中发布了ChallengeTimeStamp,然后在10天后尝试验证,服务器端。

    我的问题是:

    所有Google reCAPTCHA服务器端验证尝试中不可忽略的百分比可能是非常老的还是双重提交的原因可能是什么原因?

    **通过"服务器端验证"我的意思是这样的逻辑:

        public bool IsVerifiedUser(string captchaResponse, string endUserIp)
        {            
            string apiUrl = ConfigurationManager.AppSettings["Google_Captcha_API"];
            string secret = ConfigurationManager.AppSettings["Google_Captcha_SecretKey"];
            using (var client = new HttpClient())
            {
                var parameters = new Dictionary<string, string>
                {
                    { "secret", secret },
                    { "response", captchaResponse },
                    { "remoteip", endUserIp },
                };
                var content = new FormUrlEncodedContent(parameters);
                var response = client.PostAsync(apiUrl, content).Result;                
                var responseContent = response.Content.ReadAsStringAsync().Result;
                GoogleCaptchaResponse googleCaptchaResponse = JsonConvert.DeserializeObject<GoogleCaptchaResponse>(responseContent);
    
                if (googleCaptchaResponse.Success)
                {
                    _dal.LogGoogleRecaptchaResponse(endUserIp, captchaResponse);
                    return true;
                }
                else 
                {
                   //Actual code ommitted
                       //Try to determine the cause of failure
                       //Look at googleCaptchaResponse.ErrorCodes array (this has been empty in all of the 28 cases of "success: false")
                       //Measure time between googleCaptchaResponse.ChallengeTimeStamp (which is UTC) and DateTime.UtcNow
                       //Check reCAPTCHAresponse against local database of previously used reCAPTCHAresponses to detect cases of double submission
                   return false;
                }
            }
       }
    

    提前感谢任何有线索的人,也许可以对这个问题有所了解。

2 个答案:

答案 0 :(得分:3)

如果您的验证码经过两次验证,您将遇到超时或重复问题。 以追加模式将日志保存在文件中,并检查您是否正在验证两次验证码 这是一个例子

$verifyResponse = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='.$secret.'&response='.$_POST['g-recaptcha-response'])

file_put_contents( "logfile",  $verifyResponse, FILE_APPEND );

现在阅读上面创建的日志文件的内容,并检查验证码是否经过两次验证

答案 1 :(得分:2)

这是一个有趣的问题,但任何时候都无法回答。我可以对已经发生的事情做出有根据的猜测。

就旧的提交而言,这可能只是用户在浏览器中打开页面并稍后返回最终提交。您可以通过几种不同的方式处理此方案:

  1. 为页面设置元刷新,以便在定义的时间段后自动更新,并希望获得新的ReCAPTCHA验证码或至少提示用户再次验证CAPTCHA。但是,这不太理想,因为它增加了对服务器的请求,并且会破坏用户在表单上完成的任何工作。它也非常暴力:无论用户当前是否正在积极使用该页面,它都会在一定时间后刷新。

  2. 使用JavaScript计时器通知用户页面超时,然后刷新。这就像#1,但有更多的技巧。您可以弹出一个警告对话框,告诉用户他们已经让页面停留的时间太长而且很快就需要刷新,如果他们正在积极使用它,他们就有时间完成。您还可以通过onmousemove等活动检查用户活动。如果用户没有移动鼠标,则很可能它们不在页面上。

  3. 通过捕获此方案来处理服务器端。我实际上更喜欢这种方法,因为它是最流畅的,老实说最容易实现。当您返回success: false没有错误代码时,只需将用户发送回页面,就像他们在表单中发出验证错误一样。提供一条消息,告诉他们他们的CAPTCHA验证已过期,他们需要再次验证。然后,他们所要做的就是验证并重新提交。

  4. 双重提交问题是困扰所有网络开发者的常年问题。用户行为研究表明,绝大多数是因为用户经过双击图标培训,因此认为他们还需要双击提交按钮。如果在点击时没有立即发生某些事情,其中​​一些是不耐烦的。无论如何,您可以做的最好的事情是实现JavaScript,禁用点击按钮,防止再次点击。