Используя reCAPTCHA с ajax.... проблема загрузки javascript

Я пытаюсь реализовать reCAPTCHA в одной из моих форм, но я использую ajax в качестве представления. (Более конкретно, прототип ajax.updater)

Как только я отправляю и проверяю ошибку в своей форме, я пытаюсь загрузить виджет reCAPCHTA thingy (в моем обновленном элементе div), который в основном просто вызывает файл javascript следующим образом:

<script type="text/javascript" src="http://api.recaptcha.net/challenge?k=6Le6SwUAAAAAAIWm8wCRFd8SrI-H0R1Yx4Tkw2Ks"></script>

Однако JS файл не читается?... и я пробовал всю комбинацию evalScripts: true и evalJS: "force" и т.д. в ajax.updater..... однако я не думаю Я очень хорошо понимаю, почему файл js не обрабатывается: (

Если кто-то может пролить свет на эту проблему, я буду очень благодарен.

Спасибо, Андрей

Ответ 1

Это не касается вашей конкретной проблемы, но Dark Side of the Carton имеет отличный код для проверки reCAPTCHA через jQuery AJAX которые могут помочь.

Вкратце:

Добавьте следующий Javascript:

$(function() {
    function validateCaptcha() {
        var challengeField = $('input#recaptcha_challenge_field').val(),
            responseField  = $('input#recaptcha_response_field').val();

        // alert(challengeField);
        // alert(responseField);
        // return false;

        var html = $.ajax({
            type: 'POST',
            url: 'ajax.recaptcha.php',
            data: "recaptcha_challenge_field=" + challengeField + "&amp;recaptcha_response_field=" + responseField,
            async: false
        }).responseText;

        if (html.replace(/^\s+|\s+$/, '') == "success") {
            $('#captchaStatus').html(' ');
            // Uncomment the following line in your application
            return true;
        } else {
            $('#captchaStatus').html(
                'Your captcha is incorrect. Please try again'
            );
            Recaptcha.reload();
            return false;
        }
    }

    // Modified as per comments in site to handle event unobtrusively
    $('#signup').submit(function() {
        return validateCaptcha();
    });
});

Затем добавьте файл ajax.recaptcha.php, который: "выводит только слово" успех ", если совпадение с капчей и сообщение и ответ от reCaptchta, если он терпит неудачу. Это важно, потому что мы ищем слово" успех "в наша функция validateCaptcha().

require_once('/inc/recaptchalib.php');
$publickey  = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX'; // you got this from the signup page
$privatekey = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX';

$resp = recaptcha_check_answer(
    $privatekey,
    $_SERVER['REMOTE_ADDR'],
    $_POST['recaptcha_challenge_field'],
    $_POST['recaptcha_response_field']
);

if ($resp->is_valid) {
    ?>success< ?
} else {
    die(
        "The reCAPTCHA wasn't entered correctly. Go back and try it again." .
        "(reCAPTCHA said: " . $resp->error . ")"
    );
}

Пример в PHP, но я легко адаптировал его для работы с Zope/Python

Ответ 2

Будьте внимательны, используя валидацию любого типа клиентской стороны script, например JavaScript. У вас нет контроля над браузером конечных пользователей. Цель CAPTCHA - предотвратить автоматическое представление формы. Любой, достаточно сложный, чтобы установить это, не будет иметь проблемы с переопределением проверки JavaScript и проверки CAPTCHA. Например, они могут установить validateCaptcha(), чтобы всегда возвращать true, минуя ваши тщательные проверки - или просто отключить JavaScript.

Сказано, что нет ничего плохого в выполнении всего представления формы с помощью ajax и использовании результатов проверки CAPTCHA, чтобы определить, обрабатывается ли форма или нет.

Важным моментом является то, что решение о необходимости обработки формы должно выполняться на стороне сервера, а не на стороне клиента.

Почему проверка на стороне клиента недостаточно...

Ответ 3

чтобы ответить на мой собственный вопрос...

есть reCAPTCHA AJAX api.... что довольно простой способ обойти эту проблему:

текст ссылки

Кроме того, документация на http://www.prototypejs.org/api/ajax/updater сайте... говорит об опциях evalscript и как только помещается любой javascript через встроенную функцию eval().... какой тип винтов меня пытается пытаться выполнить проверку ошибок с помощью ОМУ... но это другая история.

Эндрю

Ответ 4

Если этот фрагмент кода вы используете, вы не закрыли тег... поэтому он не будет оцениваться.

Ответ 5

вызов Recaptcha.reload(); на событие обратного вызова в вашем коде Ajax., он будет перезагружать новую Recapcha каждый раз, когда Ajax отправлен

Ответ 7

У меня были схожие проблемы с получением reCaptcha, чтобы играть красиво при загрузке на страницу с помощью jQuery .load(). Вот страница с новым решением: http://www.maweki.de/wp/2011/08/recaptcha-inside-a-with-jquery-ajax-or-load-dynamically-loaded-object/

В основном API reCaptcha использует метод document.write для отображения reCaptcha. Когда вы вызываете jQuery invlued, это не сработает. Используйте этот код PHP вместо загрузки recaptcha.js

<?php
$api = file_get_contents('http://www.google.com/recaptcha/api/js/recaptcha_ajax.js');
$api = str_replace('document.write','$("body").append',$api);
echo $api;
?>

Он просто находит для document.write и заменяет его $(selector).append.

Сделал мою работу по внедрению.