использование reCAPTCHA с ajax .... проблема загрузки JavaScript - PullRequest
11 голосов
/ 27 февраля 2009

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

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

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

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

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

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

Ответы [ 7 ]

17 голосов
/ 05 ноября 2009

Это не решает вашу конкретную проблему, но ' Темная сторона коробки ' имеет отличный код для проверки 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, который: «выводит только слово« success », если капча совпадает, и сообщение и ответ от reCaptchta, если он не работает. Это важно, поскольку мы ищем слово success наша функция 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

4 голосов
/ 10 июня 2011

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

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

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

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

1 голос
/ 27 февраля 2009

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

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

текст ссылки

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

Andrew

0 голосов
/ 28 сентября 2013

Привет, друг, я нашел ответ

https://developers.google.com/recaptcha/docs/display?hl=es#AJAX

И в этом, как проверить

http://blog.reaccionestudio.com/comprobar-recaptcha-con-ajax-usando-jquery/

Удачи для вас

0 голосов
/ 07 декабря 2012

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

0 голосов
/ 31 января 2012

У меня были похожие проблемы с получением 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, это не сработает. Используйте этот код 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.

Сделал мою работу по реализации.

0 голосов
/ 27 февраля 2009

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

...