【问题标题】:reCAPTCHA: why can't I check the same result twice?reCAPTCHA:为什么我不能两次检查相同的结果?
【发布时间】:2012-03-02 21:45:19
【问题描述】:

我的意思是,如果我检查第一个客户的输入并且没问题,那么对同一输入的第二次检查总是错误的...... 这是为什么呢?

我真的需要检查两次(一次用于客户端验证,第二次用于服务器端验证)

提前致谢!!!

编辑

澄清:

如果用户的输入正常并且 recaptcha 返回 true(我通过 ajax 向服务器发送请求到 recaptcha 的服务器),则表单正在提交并通过 POST 发送 2 个变量:recaptcha_challenge_field 值和 recaptcha_response_field 值(已经检查过),然后我的服务器要求 recaptcha 的服务器再次检查这两个值以进行服务器端验证。

jQuery 代码:

$("#form_id").find("button").click(function(){
    var c = $("#recaptcha_challenge_field").val(),
        r = $("#recaptcha_response_field").val();

    $.ajax({
        url: "/ajax/captcha?challenge=" + c + "&response=" + r,
        dataType: "json",
        success: function(data){
            if(data['is_valid']){
                $.ajax({
                    url: "/ajax/captcha?challenge=" + c + "&response=" + r,
                    dataType: "json",
                    success: function(data){
                        if(data['is_valid']){
                            alert('OK');
                        }else{
                            alert('FAILED');
                        }
                    }
                });
            }else{
                Recaptcha.reload();
            }
        }
    });
    return false;
});

因此,正如您所见,有两个完全相同的操作具有不同的结果(它只提醒FAILED)。

【问题讨论】:

  • 这是因为一旦 RECAPTCHA 已经为生成的 RECAPTCHA 生成了成功消息。您将需要找到另一种方法来完成此操作。您可能会以错误的方式处理此问题。
  • @BarryChapman - 我终于明白你在 Session 中存储成功变量是什么意思,而不是在服务器端验证中使用它)))非常感谢!
  • 非常欢迎,我很高兴你把它整理好了!

标签: captcha recaptcha


【解决方案1】:

因为它存储在提交结果时清除的会话中。在页面加载时,会为该 CAPTCHA 值生成一个新的会话变量。

【讨论】:

  • 除非您谈论的是客户端的 POST 值。在这种情况下,重定向会丢失。您需要重新发布数据。考虑将客户端提交的响应存储在一个会话变量中,以便稍后引用。
  • 将值存储在 Session 变量中,然后执行两次 POST。并将这些值发送到 Recaptcha。
  • 您的意思是 recaptcha_challenge_fieldrecaptcha_respone_field 值?如果是的话,那就是我所做的……
  • 将它们存储在 Session 变量中和将它们直接用作 POST 的变量有什么区别?或者我没明白你的意思。
  • 那么问题出在哪里?除非您手动取消设置 $_SESSION 变量,否则它们应该仍然存在供您使用。
【解决方案2】:

为了通过 AJAX/Jquery 和服务器页面验证 Captcha 两次,这是我使用 PHP 的技术(基本思想是如果在客户端验证中输入正确的验证码,则恢复 Captcha Check 方法清除的 Captcha 会话变量,所以他们将再次在那里进行服务器端验证):

  1. 以下内容可能看起来令人困惑,因为这是我在 HTML 表单和 HTML 表单的操作页面上重复使用客户端验证的一种懒惰方式。

  2. 在 HTML 表单上,添加一个额外的 POST 变量(例如 $_POST["task"] = "validate",它不是表单中的输入元素,它将在表单提交时传递到客户端验证 PHP 页面

    $.ajax({
        type: "POST",
        url: "registration_validate.php", 
        data: ({
            task:"validate" << and other data >>
    
  3. 在客户端验证 PHP 页面

    $securimage_session_cv = $_SESSION["securimage_code_value"]["default"];
    $securimage_session_ct = $_SESSION["securimage_code_ctime"]["default"];
    if ($securimage->check($_POST['captcha_code']) == false) {
        // return false or print something
    } else {
        // if this script is called via ajax for form validation
        if(isset($_POST['task']) && trim($_POST['task']) == "validate"){
            // captcha will be cleared if valid/correct, restore them as it will be validated again on server side script
            $_SESSION["securimage_code_value"]["default"] = $securimage_session_cv;
            $_SESSION["securimage_code_ctime"]["default"] = $securimage_session_ct;
        }
    }
    
  4. 在服务器端验证页面或表单操作 url 上,您将拥有完整的验证码会话以进行验证。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-22
    • 2019-09-07
    • 2021-02-26
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    相关资源
    最近更新 更多