代码之家  ›  专栏  ›  技术社区  ›  Andrew

在ajax中使用reCAPTCHA…javascript加载问题

  •  11
  • Andrew  · 技术社区  · 17 年前

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

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

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

    但是JS文件没有被读取?。。。我在ajax中尝试了所有evalscript的组合:true和evalJS:“force”等。更新程序。。。。。然而,我不认为我对js文件为什么不处理有很好的理解:(

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

    谢谢,安德鲁

    7 回复  |  直到 14 年前
        1
  •  17
  •   Yes Barry    12 年前

    这并不能解决你的问题,但是 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。雷帕查。php文件:“如果验证码匹配,则只输出单词success,如果失败,则输出消息和来自reCaptchta的响应。这很重要,因为我们在validateCaptcha()函数中寻找单词success。”

    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
  •  4
  •   Community Mohan Dere    9 年前

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

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

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

    Why client-side validation is not enough

        3
  •  1
  •   Andrew    17 年前

    回答我自己的问题。。。

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

    link text

    而且关于 http://www.prototypejs.org/api/ajax/updater 地点讨论了evalscript选项,以及它如何仅通过原生eval()函数来放置任何javascript。。。。这让我在尝试使用大规模杀伤性武器进行错误检查时陷入了困境。。。但这是另一个故事。

    安得烈

        4
  •  0
  •   Matt Howell    17 年前

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

        5
  •  0
  •   Somwang Souksavatd    13 年前

    打电话给雷帕查。重新加载();在Ajax代码中的回调事件上。,每次Ajax提交时,它都会重新加载新的Recapcha

        6
  •  0
  •   infinito84    13 年前
        7
  •  0
  •   Yusuf Mohammad    5 年前

    使用reCaptcha保护AJAX调用

    function performAJAX() {
        let captcha = $('[name=g-recaptcha-response]');
        $.ajax({
             url: 'ajaxHandler.html',
             data: {
                captcha: (captcha.length?captcha[0].value:''),
                // other data fields
             },
        });
    }
    
        8
  •  -1
  •   Prasad Jadhav Psi    13 年前

    我也有过类似的问题 reCaptcha 使用jQuery的 .load() 方法以下是一个具有新颖解决方案的页面: http://www.maweki.de/wp/2011/08/recaptcha-inside-a-with-jquery-ajax-or-load-dynamically-loaded-object/

    基本上,reCaptcha API使用文档。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;
    ?>
    

    它只是查找文档。编写并替换为 $(selector).append .

    使我的实施工作顺利进行。