1

在提交包含验证码字段的表单的其余部分之前,我正在使用以下代码(通过“纸箱的黑暗面”)验证 reCAPTCHA字段。

验证工作正常,调用 'recaptchavalidate' 页面,正确返回TrueFalse并且 JavaScript 将其全部拾取(我通过alert(html);进行测试)。

但是,当True时,表单不会像您期望的那样继续被提交。事实上,更糟糕的是,reCAPTCHA 会像响应错误一样刷新。

我认为这是我的 JavaScript 有问题,而不是 reCAPTCHA ......但我哪里出错了?

<script type="text/javascript">
    $(function(){
        function validateCaptcha()
        {
            challengeField = $("input#recaptcha_challenge_field").val();
            responseField = $("input#recaptcha_response_field").val();
            // alert(challengeField);
            // alert(responseField);
            //return false;
            var html = $.ajax({
            type: "POST",
            url: "recaptchavalidate",
            data: "recaptcha_challenge_field="+challengeField+ "&amp;recaptcha_response_field="+responseField,
            async: false
            }).responseText;

            if(html == "True")

            {
                $("#captchaStatus").html(" ");
                alert(html);//test
                return true;
            }
            else
            {
                $("#captchaStatus").html("Your captcha is incorrect. Please try again");
                alert(html);//test
                Recaptcha.reload();
                return false;
            }
        }


        $("#signup").submit(function(){
            return validateCaptcha();
    });
    });

    </script>

编辑:这仅用于在提交之前检查没有错误。提交后(通过 Python,而不是 JS)正确检查 reCAPTCHA。因此,安全漏洞并没有一些用户指出的那么大。

4

4 回答 4

1

不是警告“html”,而是硬编码“true”和“false”,这样您就可以确定它到达了正确的位置。

if(html == "True")
{
    $("#captchaStatus").html(" ");
            alert("true");//test
    return true;
}
else
{
    $("#captchaStatus").html("Your captcha is incorrect. Please try again");
            alert("false");//test
    Recaptcha.reload();
    return false;
}

然后报告你的发现。

于 2009-11-05T17:09:14.980 回答
1

看来你的测试html == "True"没有通过。您确定那是您返回的确切字符串"True"没有额外的字符/空格吗?例如,如果字符串的开头或结尾有空格,则传递将失败,但如果您通过警告框显示文本,它仍然看起来像“真”。

尝试使用此检查从字符串末尾修剪空格:

if (html.replace(/^\s+|\s+$/, '') == "True")
于 2009-11-10T17:16:49.460 回答
0

我迫不及待地想在现实世界中遇到这种情况。:)

然后我会破解你的javascript并替换validateCaptcha()

function validateCaptcha() {
  return true;
}
于 2009-11-05T15:29:13.707 回答
0

也许你有

onclick="validateCaptcha();"

代替

onclick="return validateCaptcha();"

以便始终调用父元素的(链接、按钮、表单)默认操作。

如果这一切都很好,那么我能看到的唯一原因是表单提交确实触发了不正确的请求或服务器错误地处理了请求。在验证码验证的“真实”结果之后,使用 HTTP 监视器/分析器工具/插件检查究竟调用了哪种请求。至少听起来它触发了例如普通的 GET 请求而不是对服务器的 POST 请求和/或服务器忽略了特定请求,因为它没有识别 URL 模式和/或请求参数。

于 2009-11-10T17:23:24.813 回答