2017-09-22 127 views
0

我遵循this page 的说明执行隐形recaptcha。一切都很好,但我怎么知道它在工作?有没有办法迫使一个错误来测试它?我是否需要验证Google Invisible reCaptcha的结果

此外,文档不清楚上面的页面,但有些地方有额外的代码来验证用户的“回复”(它是不可见的,所以我不知道这是什么答案) - 所以我需要添加额外的后端逻辑,以this端点与不可见的reCaptcha生成的令牌和我的密钥?

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

+0

你见过https://developers.google.com/recaptcha/docs/verify的ASHX和Ajax? – kichik

+0

是的 - 但是不可见实现页面上的文档并不清楚是否需要验证,以及一些人们没有任何代码验证的示例(https://jsfiddle.net/jayh99/dp1cLh28/),而其他做(http://www.pinnacleinternet.com/installing-invisible-recaptcha/)所以 - 是否有必要? – user6383418

+0

当然是。什么能阻止某人在没有它的情况下脚本化你的表单? – kichik

回答

1

经过一些测试,看起来你可以做前端部分。数据回调函数不会被调用,直到谷歌确信你是一个人,如果谷歌不确定,然后它加载“选择哪些瓷砖有一件事情”reCaptcha肯定。一旦reCaptcha api确定它是一个人,数据回调函数被触发 - 那时你可以做进一步验证,以确保你在回调期间收到的令牌是谷歌实际发送的令牌,而不是试图通过点击回调函数来欺骗你 - 所以你从服务器端进行处理以进一步验证。下面是一个C#ashx的处理程序示例 - 用于验证

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

而且

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; 
    } 
}