Версия Recaptcha Validate для JavaScript, JQuery или AJAX

Я пытаюсь проверить recaptcha, используя некоторый код js, но получаю разрешение. Ошибки «Доступ запрещен» Можно ли выполнить проверку с помощью кода проверки javascript вместе с ajax в нескольких браузерах.

<script type="text/javascript">


    $(document).ready(function() {

        Recaptcha.create("var_public_key", recaptchadiv, {
            theme: "clean",
            callback: Recaptcha.focus_response_field
        });
    });


function submitFormData() {

var urlString = "http://www.google.com/recaptcha/api/verify";
var params = encodeURI("remoteip=" + $("#userIp").val() +"&privatekey=" + var_private_key + "&challenge=" + Recaptcha.get_challenge() + "&response=" +
Recaptcha.get_response());
        params = encodeURI(params);
        var status = document.getElementById("status");
        status.className = "";
        status.innerHTML = "<b>Submitting your data. Please wait...</b>";
        var html = $.ajax({
            type: "POST",
            url: urlString + "?" + params,
            async: false
        }).responseText;

        alert("ResponseText: " + html + ", Recaptcha.responseText: " + Recaptcha.responseText);

        var result = html.split("\n")[0];

        if (result == "true") {
            status.innerHTML = " ";
            return true;
        }
        else {
            status.className = "GlobalErrorText";
            status.innerHTML = "Your captcha is incorrect. Please try again";
            Recaptcha.reload();
            return false;
        }
    }
</script>


person abhijit    schedule 21.05.2011    source источник


Ответы (3)


@Boug прав, это называется межсайтовый запрос ajax, вы можете увидеть этот вопрос, чтобы узнать, сможете ли вы найти решение Межсайтовые запросы AJAX, но ....

Я думаю, что размещение вашего закрытого ключа для recaptcha в javascript - это уязвимость, recaptcha следует проверять на коде на стороне сервера, этот вопрос содержит полезные ссылки о том, как реализовать recaptcha в Asp.Net MVC Как реализовать reCaptcha для ASP.NET MVC? Я использовал этот подход, и он отлично работает http://www.dotnetcurry.com/ShowArticle.aspx?ID=611&AspxAutoDetectCookieSupport=1

person k-dev    schedule 21.05.2011
comment
большое спасибо ... я бы попробовал реализовать это ... спасибо, что поделились знаниями - person abhijit; 21.05.2011
comment
как проверить Рекапчу на сервере? - person The Light; 07.11.2012

Вы получаете ошибку разрешения, потому что ваш код ajax пытается получить доступ к сценарию на другом сайте (в Google) в качестве вашего сценария. Насколько я знаю, я не думаю, что вы можете выполнять межсайтовые вызовы Ajax по соображениям безопасности.

person boug    schedule 21.05.2011

На вопрос уже дан ответ. Но вот некоторый добавленный код, который будет работать в ASP.NET WebForms, который позволяет вам сделать локальный запрос AJAX к странице с элементом управления reCaptcha, а затем выполнить проверку Captcha на стороне сервера. Веб-метод страницы вернет true / false.

Я получил этот код из mindfire solutions, но добавлено выполнение функций JS в обратном вызове успеха Ajax. b / c Ajax выполняет асинхронные обратные вызовы.

Javascript:

<script type="text/javascript">
$(function(e) {
    $("#submit").click(function() { // my button is type=button, not type=submit
        // I'm using jQuery validation and want to make sure page is valid before making Ajax request
        if ( $("#aspnetForm").valid() ) {
            validateCaptcha();  // or validateCaptchaJson() if you want to use Json
        }   // end  If ($("#aspnetForm").valid())
    }); // end $("#submit").click()
}); // end $(function(e)


function validateCaptcha() {
    // Individual string variables storing captcha values
    var challengeField = $("input#recaptcha_challenge_field").val();
    var responseField = $("input#recaptcha_response_field").val();

    // Ajax post to page web method that will do server-side captcha validation
    $.ajax({
        type: "POST",
        url: "page.aspx/ValidateCaptcha",
        data: "recaptcha_challenge_field=" + challengeField + "&amp;recaptcha_response_field=" + responseField,
        async: false
        success: function(msg) {
            if(msg.d) { // Either true or false, true indicates CAPTCHA is validated successfully.
                // this could hide your captcha widget
                $("#recaptcha_widget_div").html(" ");
                // execute some JS function upon successful captcha validation
                goodCaptcha();
            } else {
                // execute some JS function upon failed captcha validation (like throwing up a modal indicating failed attempt)
                badCaptcha();
                // don't forget to reload/reset the captcha to try again
                Recaptcha.reload();
            }
            return false;
        }
    });
}

function validateCaptchaJson() {
    // JavaScript object storing captcha values
    var captchaInfo = {
        challengeValue: Recaptcha.get_challenge(),
        responseValue: Recaptcha.get_response()
    };

    // Ajax post to page web method that will do server-side captcha validation
    $.ajax({
        type: "POST",
        url: "page.aspx/ValidateCaptcha",
        data: JSON.stringify(captchaInfo),  // requires ref to JSON (http://www.JSON.org/json2.js)
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        success: function(msg) {
            if(msg.d) { // Either true or false, true indicates CAPTCHA is validated successfully.
                // this could hide your captcha widget
                $("#recaptcha_widget_div").html(" ");
                // execute some JS function upon successful captcha validation
                goodCaptcha();
            } else {
                // execute some JS function upon failed captcha validation (like throwing up a modal indicating failed attempt)
                badCaptcha();
                // don't forget to reload/reset the captcha to try again
                Recaptcha.reload();
            }
            return false;
        }
    });
}
</script>

Веб-метод страницы (VB.NET):

<WebMethod()> _
Public Shared Function ValidateCaptcha(ByVal challengeValue As String, ByVal responseValue As String) As Boolean
    ' IDEA: Get Private key of the CAPTCHA from Web.config file.
    Dim captchaValidtor As New Recaptcha.RecaptchaValidator() With { _
     .PrivateKey = "your_private_key_goes_here", _
     .RemoteIP = HttpContext.Current.Request.UserHostAddress, _
     .Challenge = challengeValue, _
     .Response = responseValue _
    }

    ' Send data about captcha validation to reCAPTCHA site.
    Dim recaptchaResponse As Recaptcha.RecaptchaResponse = captchaValidtor.Validate()
    ' Get boolean value about Captcha success / failure.
    Return recaptchaResponse.IsValid
End Function
person mmengel    schedule 03.04.2012
comment
Я видел, что вы вызываете Recaptcha прямо в js, почему это работает? - person AsyncMoksha; 29.04.2014