2009-02-27 123 views
11

我试图在我的窗体之一实现reCAPTCHA,...但我使用ajax作为提交。 (更具体的原型的Ajax.Updater)使用reCAPTCHA与ajax .... javascript加载问题

一旦我提交和错误检查我的表单我尝试加载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文件为什么不处理有很好的理解:(

如果有人可以在这个问题上提出一些看法,我会非常感激。

感谢,安德鲁

+2

你有没有找到这个解决方案?我遇到完全相同的问题......谢谢。 – 2011-11-11 13:05:31

回答

0

如果是这样的文字代码片断你使用,你有没有关闭的标签......所以它不会进行评估。

+0

不是。复制错误。 – Andrew 2009-02-27 05:35:25

1

回答我的问题...

有一个验证码AJAX API ....这是很简单的方法来解决这个问题:

link text

而且,..关于http://www.prototypejs.org/api/ajax/updater网站的文档.....有关evalscript选项的讨论,以及如何通过本机eval()函数放置任何javascript ....这种螺丝钉我试图用WMD实现错误检查......但那是另一回事。

安德鲁

+3

无效链接。确切地说,为什么infinito84的答案是downvoted ... – MadTurki 2014-01-03 01:52:48

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文件:如果验证码匹配“只输出单词‘成功’和消息和如果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的工作

+0

嗯,你应该在会话中存储验证的结果,因为你可能会跳过validateCaptcha调用并提交表单而不解决验证码。还请记住在执行验证码保护操作后在会话中重置它,因此一个解决方案不能多次使用。 – iGEL 2012-07-13 13:13:29

+0

出于某种原因,我得到了一个未定义的索引'$ _POST [“recaptcha_challenge_field”],直到我用json重写了ajax调用中的数据设置。 – regularmike 2013-04-30 18:14:28

+0

AJAX数据应该是: `数据: “recaptcha_challenge_field =” + challengeField + “&recaptcha_response_field =” + responseField,` 没有``&右键 – 2014-01-28 17:54:35

4

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

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

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

Why client-side validation is not enough

-1

我有过类似的问题与得到reCaptcha当加载到使用jQuery的​​方法页面以发挥很好。这是一个有新颖解决方案的页面: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; 
?> 

它只是做了查找文件撰写,并与$(selector).append替换它的。

使我的实施工作。

0

call Recaptcha.reload();在你的Ajax代码回调事件,它会重新加载新Recapcha每一个阿贾克斯提交