11

我试图在我的一种形式中实现 reCAPTCHA,但我使用 ajax 作为提交。(更具体地说,原型 ajax.updater)

一旦我提交并错误检查我的表单,我会尝试加载 reCAPCHTA 小部件(在我更新的 div 元素中),它基本上只是调用一个 javascript 文件,如下所示:

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

但是没有读取 JS 文件?...我已经在 ajax.updater 中尝试了 evalScripts:true 和 evalJS:'force' 等的所有组合.....但是我认为我没有很好理解为什么 js 文件没有处理:(

如果有人能对这个问题有所了解,我将不胜感激。

谢谢,安德鲁

4

8 回答 8

17

This doesn't address your exact problem, but 'Dark Side of the Carton' has some excellent code for validating reCAPTCHA via jQuery AJAX which might help.

In summary:

Add the following 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();
    });
});

Then add the ajax.recaptcha.php file which: "outputs only the word “success” if the captcha matches and a message and the response from reCaptchta if it fails. This is important because we are looking for the word success in our validateCaptcha() function."

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 . ")"
    );
}

The example is in PHP, but I adapted it easily to work with Zope/Python

于 2009-11-05T14:00:19.510 回答
4

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

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

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

为什么客户端验证还不够

于 2011-06-10T06:04:51.940 回答
1

回答我自己的问题...

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

链接文本

此外,.. http://www.prototypejs.org/api/ajax/updater网站上的文档......讨论了 evalscript 选项以及如何仅通过本机 eval() 函数放置任何 javascript.. ..哪种让我对尝试使用 WMD 实施错误检查感到困惑...但那是另一回事了。

安德鲁

于 2009-02-27T18:09:39.037 回答
0

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

于 2012-12-07T19:06:50.003 回答
0

如果那是您正在使用的文字代码片段,那么您还没有关闭标签......所以它不会被评估。

于 2009-02-27T05:20:50.617 回答
0

嗨朋友我找到了答案

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

在这如何验证

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

为你成功

于 2013-09-28T07:11:23.273 回答
0

使用 reCaptcha 保护 AJAX 调用

function performAJAX() {
    let captcha = $('[name=g-recaptcha-response]');
    $.ajax({
         url: 'ajaxHandler.html',
         data: {
            captcha: (captcha.length?captcha[0].value:''),
            // other data fields
         },
    });
}
于 2021-08-28T15:56:17.100 回答
-1

reCaptcha当使用 jQuery 的.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 时,这将不起作用。使用此 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.

使我的实施工作。

于 2012-01-31T17:30:18.263 回答