0

私は自分のウェブサイトの登録フォームで jQuery 検証を使用しており、下部に reCaptcha があります。フォームのエラーをチェックするスクリプトは次のとおりです (関連する部分のみに編集されています)。

$(document).ready(function() { 
  jQuery.validator.addMethod("checkCaptcha", function() {
    var phpquery = $.ajax({url:"verify.php",
      type: "POST",
      async: false,
      data:{recaptcha_challenge_field:Recaptcha.get_challenge(),recaptcha_response_field:Recaptcha.get_response()},
      success:function(resp) {
        if (resp == 'false') {
          console.dir(resp);
          return false;
        } else {
          console.dir(resp);
          return true;
        }
      }
    });
  },"");

  $('#regForm').validate({
    rules:{
      recaptcha_response_field:{required:true,checkCaptcha:true}
    },
    messages:{
      recaptcha_response_field:{checkCaptcha:"Your Captcha response was incorrect. Please try again."}
    }
  });
});

正しい reCaptcha 応答を入力し、送信をクリックするか、応答テキスト フィールドからタブで移動すると、最初はtrueコンソールに表示され、すぐにスローfalseされ、フォームの送信が妨げられます。

また、間違った reCaptcha 応答が入力された場合、想定どおりにスローさfalseれますが、入力したすべての文字に対して、それを送信してverify.phpに返しfalseます。最終的に正しい reCaptcha の入力を完了すると、それが認識されず、false.

reCaptcha をリロードするfalseと、正しい応答が入力された場合でも がスローされます。

verify.phpなぜなら、すべて<form>action="verify.php,"完全に機能するからです (つまり、何回試行しても、正しい reCaptcha を入力したかどうかがわかります) 。

何か不足していますか?これを行うためのより簡単で信頼できる方法はありますか?

4

4 に答える 4

4

onkeyup: false内のオプションを使用します.validate()

そうしないと、文字を 1 つ入力するたびにcheckCaptchaメソッドが実行され、不完全な Captcha コードがサーバーに送信されます。間違った Captcha コードが送信されると、そのコードは期限切れになり、同じコードを再度送信することはできないと思います。

いずれにせよ、フィールドが完了するまでコードをサーバーに送信しないのが最善だと思います。

$('#regForm').validate({
    onkeyup: false,
    rules:{
        recaptcha_response_field: {
            required: true,
            checkCaptcha: true
        }
    },
    messages:{
        recaptcha_response_field: {
            checkCaptcha: "Your Captcha response was incorrect. Please try again."
        }
    }
});

また、Captcha が失敗した場合は、更新をトリガーして新しいコードを取得する必要があります。

Recaptcha.reload();

コールバック内successで、おそらく...

success:function(resp) {
    if (resp == 'false') {
        console.dir(resp);
        Recaptcha.reload();  // get a new captcha code on failure
        return false;
    } else {
        console.dir(resp);
        return true;
    }
}
于 2013-08-10T14:10:40.260 に答える
1

最初の addMethod バリデーターの問題は、true または false を返す方法に関するもので、2 つ目は本来あるべきものよりも複雑です。サーバー側からどのように処理するかはわかりませんが、おそらく次のコードが必要です。

http://blog.netgloo.com/2014/06/03/adding-recaptcha-validator-to-jquery-validate/

それは私にとってとてもうまくいきます!

于 2014-06-03T20:51:25.163 に答える
0

よし、やっと手に入れた(回避策かもしれないが)。これが新しいものaddMethodです:

jQuery.validator.addMethod("checkCaptcha", function() {
 var bfr = false;
 var phpquery = $.ajax({url:"verify.php",
  type: "POST",
  async: false,
  data:{recaptcha_challenge_field:Recaptcha.get_challenge(),recaptcha_response_field:Recaptcha.get_response()},
  complete:function(resp) {
    if(resp.responseText.indexOf("false")>=0){
     Recaptcha.reload();
    }else{
     bfr = true;
    }
  }
 });
if(bfr){
   return true;
 }
},"");

onkeyup:falseまた、 、onclick:false、およびonfocusout:falseを に追加しましたvalidate()。これで仕事が捗りそうです。

于 2013-08-11T02:16:45.117 に答える
-1

これは、「 AJAXリクエストを使用したキャプチャの検証」に関する私の考えです。

フォームにキャプチャを追加する主な理由は、フォームを送信したのがボットか人間かを確認するためです。そのため、他のフィールドにエラーがあったとしても、キャプチャの送信が成功した後は、明らかにそれが人間であることがわかります。そのため、最初の成功後にキャプチャ フィールドを削除してもまったく問題ありません (成功するまでキャプチャを更新してください)。その後、通常どおり他のフィールドを処理できます。

異議はありますか?

于 2014-01-11T10:30:02.723 に答える