使用PHP和jQuery进行ReCaptcha验证

使用PHP和jQuery进行ReCaptcha验证,php,javascript,jquery,ajax,recaptcha,Php,Javascript,Jquery,Ajax,Recaptcha,我正在努力做一份好的登记表。起初,我制作了一个PHP验证脚本,因为我确信它是安全的。 当我错误地发布表单并返回错误时,我所有的输入值都消失了。 我不喜欢这样,所以我学习了Javascript验证。我对Javascript没有太多的经验,但我已经设法用客户端和服务器端验证来验证我的表单,除了ReCaptcha字段 问题是,如果我正确填写代码并按Submit,客户端验证返回“成功”,而服务器端验证总是返回“错误” 如果我只使用服务器端脚本进行验证,那么它将返回“Succes”,因此脚本本身很好,但不

我正在努力做一份好的登记表。起初,我制作了一个PHP验证脚本,因为我确信它是安全的。 当我错误地发布表单并返回错误时,我所有的输入值都消失了。 我不喜欢这样,所以我学习了Javascript验证。我对Javascript没有太多的经验,但我已经设法用客户端和服务器端验证来验证我的表单,除了ReCaptcha字段

问题是,如果我正确填写代码并按Submit,客户端验证返回“成功”,而服务器端验证总是返回“错误”

如果我只使用服务器端脚本进行验证,那么它将返回“Succes”,因此脚本本身很好,但不知何故,它们无法使用相同的代码相互配合

客户端recaptcha验证脚本:

function validateCaptcha()
{
challengeField = $("input#recaptcha_challenge_field").val();
responseField = $("input#recaptcha_response_field").val();
//console.log(challengeField);
//console.log(responseField);
//return false;
var html = $.ajax({
    type: "POST",
    url: "handlers/ajax.recaptcha.php",
    data: "recaptcha_challenge_field=" + challengeField + "&recaptcha_response_field=" + responseField,
    async: false
    }).responseText;

//console.log( html );
if(html == "success") {
    //Add the Action to the Form
    $("form").attr("action", "handlers/register_handler.php");
    //Indicate a Successful Captcha
    $("#captchaStatus").html("Success!");
    // Uncomment the following line in your application
    return true;
} else {
    $("#captchaStatus").html("The security code you entered did not match. Please try again.");
    Recaptcha.reload();
    return false;
}
}   
require_once('recaptchalib.php');
$privatekey = "private key";
$resp = recaptcha_check_answer ($privatekey,
                            $_SERVER["REMOTE_ADDR"],
                            $_POST["recaptcha_challenge_field"],
                            $_POST["recaptcha_response_field"]);

if (!$resp->is_valid) {
echo "error"; }
else { echo "succes"; }
ajax.recaptcha.php

<?php
require_once('recaptchalib.php');
$privatekey = "private key";
$resp = recaptcha_check_answer ($privatekey,
                            $_SERVER["REMOTE_ADDR"],
                            $_POST["recaptcha_challenge_field"],
                            $_POST["recaptcha_response_field"]);
if ($resp->is_valid) {
echo "success";
} else {
die ("The reCAPTCHA wasn't entered correctly. Go back and try it again." .
   "(reCAPTCHA said: " . $resp->error . ")");
}
?>
他们都差不多,所以我真的不知道我做错了什么

请帮助我,因为我不想在验证码错误的情况下再次输入所有信息

提前谢谢

编辑:
我发现,客户端验证和服务器端验证使用相同的质询字段代码。可能因为质询字段代码只能使用一次而无法使用?如果是这样的话,有没有办法让这对我有用

首先,我认为你不需要这两个看起来非常相似的脚本

您试图实现的是让jQuery通过ajax执行部分回发,以检查服务器,如果正确,则继续提交表单。到目前为止,这似乎工作正常,但您需要设置
async:true

当返回该答案而不是“成功”时,更好的方法是返回您在此行中设置的操作:

$("form").attr("action", "handlers/register_handler.php");
目前,任何人只要检查源代码并构造自己对
handlers/register\u handler.php
的请求,就可以绕过您的验证码

我刚刚遇到,我相信这会有帮助


当然,我可能对你想要达到的目标有误解。如果是这样,您的问题是否可能存在于某个地方?

reCaptcha故意拒绝多次提交到其服务器的验证码(例如,通过客户端和服务器端验证)。您需要咬紧牙关,重写
register\u handler.php
脚本,以重新显示表单输入或将其作为AJAX操作写入。这里有一个不同的想法:如果表单提交失败,您可以使用用户提交的数据重新填充表单。使用session或任何你想用用户提交的数据重新填充表单的东西。

这里有点问题,你的第一个例子不可能是客户端,因为php是服务器端技术
你说得对,我在我的问题中添加了调用“客户端”php代码的javascript代码。+1用于文章链接(尽管它已经移到了这里:)