使用PHP和jQuery进行ReCaptcha验证

时间:2011-09-08 21:44:50

标签: php javascript jquery ajax recaptcha

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

问题是,如果我正确填写代码并按提交,客户端验证将返回'Succes',但服务器端验证始终返回'错误'。

如果我只使用服务器端脚本进行验证,它将返回'Succes',因此脚本本身很好,但不知怎的,它们在相同的代码之后不能互相工作。

客户端重新验证验证脚本:

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;
}
}   

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

服务器端重访验证脚本:

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

他们都是一样的,所以我真的不知道我在这里做错了什么。

请帮帮我,因为当我只收到错误的Captcha代码时,我不想再输入所有信息。

提前致谢

编辑: 我发现同样的挑战字段代码用于客户端验证作为服务器端验证。也许它不会起作用,因为挑战字段代码只能使用一次?如果是这样,有没有办法让这项工作适合我?

3 个答案:

答案 0 :(得分:3)

reCaptcha故意拒绝多次提交给其服务器的CAPTCHA(例如,通过客户端和服务器端验证)。您需要咬紧牙关并将register_handler.php脚本重写为重新显示表单输入或将其写为AJAX操作。

答案 1 :(得分:1)

首先,我不相信你需要这两个非常相似的脚本。

你想要实现的是让jQuery通过ajax进行部分回发以检查服务器,如果正确则继续提交表单。到目前为止,这似乎工作得很好,除了你想设置async: true

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

$("form").attr("action", "handlers/register_handler.php");

目前,任何人都可以通过简单地检查来源并构建自己的handlers/register_handler.php请求来绕过验证码。

我刚遇到this,我认为应该有所帮助。

当然,我可能有一个错误的结束你想要实现的目标。如果是这样,可以在某个地方托管您的问题吗?

答案 2 :(得分:0)

这是一个不同的想法:如果表单提交失败,您可以使用用户提交的数据重新填充表单。使用会话或您想要使用用户提交的数据重新填充表单的任何内容。