1

次のコードを(「カートンのダークサイド」経由で)使用して、キャプチャフィールドを含むフォームの残りの部分を送信する前に、reCAPTCHAフィールドを検証しています。

検証は正常に機能し、「recaptchavalidate」ページが呼び出され、TrueまたはFalseが正しく返され、JavaScriptがこれをすべて取得します(これはalert(html);でテストします)。

ただし、Trueの場合、フォームは期待どおりにサビットされ続けません。実際、さらに悪いことに、reCAPTCHAは応答が間違っているかのように更新されます。

reCAPTCHAではなくJavaScriptに問題があると思いますが、どこが間違っているのでしょうか。

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

編集:これは、送信する前にエラーがないことを確認するためにのみ使用されます。reCAPTCHAは、送信後に適切にチェックされます(JSではなくPythonを介して)。したがって、一部のユーザーが指摘しているほど大きなセキュリティホールではありません。

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"返される正確な文字列に余分な文字や空白がないことを確認しますか?たとえば、文字列の最初または最後に空白がある場合、パスは失敗しますが、アラートボックスを介してテキストを表示すると、「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モニター/アナライザーツール/プラグインで確認します。少なくとも、たとえばサーバーへのPOSTリクエストではなくプレーンなGETリクエストが発生したか、サーバーがURLパターンやリクエストパラメータを認識しなかったために特定のリクエストを無視したように聞こえます。

于 2009-11-10T17:23:24.813 に答える