0

GoogleのreCaptchaを使用して、フォーム検証でキャプチャを処理しようとしています。基本的に、フォーム タグで onSubmit を使用して検証関数が呼び出され、recaptcha API を操作する 2 番目の関数が呼び出されます。

コードは次のとおりです。

        var returnValue;

        var myData = {
            privatekey  : "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
            remoteip : ip,
            challenge : challenge,
            response : response
        };

        $.ajax({
            url: "http://www.google.com/recaptcha/api/verify",
            type: "POST",
            data: JSON.stringify(myData),
            dataType: "text",
            success: function(data) {
                var result = data.split("\n");
                if (result[0] == "true") {
                    returnValue = true;
                }
                else {
                    returnValue = false;
                }
            },
            error: function(jqXHR, textStatus, errorThrown) {
                alert("There was an error submitting the captcha.  Please contact an administrator. \n\nError:\n" + textStatus, errorThrown);
                returnValue = false;                    
            },
            complete: function(jqXHR, textStatus) {
                return returnValue;
            }
        });

Firefox で LiveHTTPHeaders を使用すると、リクエストがサービスに送信され、すべてが正しく送信されていることがわかります。HTTP/1.1 200 OK 応答が返されますが、コードがエラー関数になるたびに. エラー関数が実行されると、jqXHR は次のようになります。

オブジェクト { readyState=0, status=0, statusText="エラー"}

textStatus は「エラー」、errorThrown は「」

$.POST を含め、.done()、.fail()、.always() を使用して、これをさまざまな方法で実行しようとしましたが、常に同じように動作します。

ここでクロスドメインリクエストの問題に関係する他の投稿を見てきましたが、実際にクロスドメインリクエストを行っているため、これらの状況はどれも実際には関連していないようです。同じドメイン上のファイルにリクエストを送信すると、クロスドメイン リクエストとして誤って処理されていました。

私はここで機知に富んでいます..どんな助けでも大歓迎です。

4

2 に答える 2

2

クロスドメインリクエストの問題に関係する他の投稿をここで見ましたが、実際にクロスドメインリクエストを行っているため、これらの状況はどれも実際には関連していないようです

そのコードを実行すると、次のエラーが表示されます。

XMLHttpRequest cannot load http://www.google.com/recaptcha/api/verify.
Origin http://fiddle.jshell.net is not allowed by Access-Control-Allow-Origin.

したがって、これはクロスドメインの問題です。クロス ドメイン リクエストを行いたいと思うかもしれませんが、Google はそれを許可するように設定されていません。

recaptcha はサーバー側のコードで実装する必要があると確信しています。JS を使用してクライアント上で完全に実行すると、クライアントは嘘をつき、キャプチャに合格していないのに合格したと言うことができます。

于 2012-10-08T20:24:36.670 に答える
0
function check(){
    $.post('check.php',{
        'check':1,
        'challenge':$('#recaptcha_challenge_field').val(),
        'response':$('#recaptcha_response_field').val()},
        function(a){
            console.log(a);
        });
}

check.php:

if($_POST){
    if(isset($_POST['check'])){
        $url = 'http://www.google.com/recaptcha/api/verify';

        $data = array(
            'privatekey'=>  "**********************************",
            'remoteip'  =>  $_SERVER['REMOTE_ADDR'],
            'challenge' =>  $_POST['challenge'],
            'response'  =>  $_POST['response'],
        );
        $options = array(
            'http' => array(
                'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
                'method'  => 'POST',
                'content' => http_build_query($data),           
            ),
        );
        echo print_r($data,true);
        die(file_get_contents($url, false, stream_context_create($options)));
    }
}

警告: チェックする選択肢は 1 つだけです! (参照)

于 2014-01-09T09:30:48.407 に答える