使用reCAPTCHA与ajax .... javascript加载问题

时间:2009-02-27 05:17:27

标签: javascript ajax prototypejs recaptcha

我尝试在我的一个表单中实现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 个答案:

答案 0 :(得分:17)

这并不能解决您的确切问题,但“Dark Side of the Carton”有一些优秀的代码可以通过jQuery AJAX验证reCAPTCHA,这可能有所帮助。

总结:

添加以下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的响应。这很重要因为我们正在寻找成功这个词我们的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

答案 1 :(得分:4)

小心使用任何类型的客户端脚本(例如JavaScript)进行验证。您无法控制最终用户的浏览器。 CAPTCHA的目的是防止自动提交表单。任何足以完成设置的人都不会有覆盖JavaScript验证和CAPTCHA检查的问题。例如,他们可以将validateCaptcha()设置为始终返回true,绕过仔细检查 - 或者只是禁用JavaScript。

话虽如此,使用ajax执行整个表单提交并使用CAPTCHA检查的结果确定表单是否得到处理没有任何问题。

重要的一点是,是否处理表单的决定必须在服务器端而不是客户端进行。

Why client-side validation is not enough

答案 2 :(得分:1)

回答我自己的问题......

有一个reCAPTCHA AJAX api ....这是解决这个问题的简单方法:

link text

另外,.. http://www.prototypejs.org/api/ajax/updater网站上的文档.....谈论evalscript选项以及如何通过本机eval()函数放置任何javascript ....哪种螺丝我试图用WMD实现错误检查......但这是另一个故事。

安德鲁

答案 3 :(得分:0)

如果这是您正在使用的文字代码段,则表示您尚未关闭代码...因此无法对其进行评估。

答案 4 :(得分:0)

致电Recaptcha.reload();在Ajax代码中的回调事件中,每次Ajax提交时都会重新加载新的Recapcha

答案 5 :(得分:0)

答案 6 :(得分:-1)

在使用jQuery的reCaptcha方法加载到页面中时,我遇到了类似的问题。.load()可以很好地播放。这是一个有新颖解决方案的页面:http://www.maweki.de/wp/2011/08/recaptcha-inside-a-with-jquery-ajax-or-load-dynamically-loaded-object/

基本上,reCaptcha API使用document.write方法显示reCaptcha。当你得到jQuery invloved时,这将无法正常工作。使用此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

让我的实施工作。