【问题标题】:ReCaptcha validation with both PHP and jQuery使用 PHP 和 jQuery 进行 ReCaptcha 验证
【发布时间】:2014-08-27 00:27:28
【问题描述】:

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

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

如果我只使用服务器端脚本进行验证,它会返回“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;
}
}   

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

服务器端recaptcha验证脚本:

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

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

请帮帮我,因为当我只是验证码错误时,我不想再次输入所有信息。

提前致谢

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

【问题讨论】:

  • 这里有问题,您的第一个示例不可能是客户端,因为 php 是一种服务器端技术&lt;?php 在客户端上没有位置。 reCaptcha 有很好的文档,不是吗?
  • 你就在那儿,我已将调用“客户端”PHP 代码的 javascript 代码添加到我的问题中。

标签: php javascript jquery ajax recaptcha


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

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

    【讨论】:

    【解决方案3】:

    这是一个不同的想法:如果表单提交失败,您可以使用用户提交的数据重新填充表单。使用 session 或任何你想用用户提交的数据重新填充表单的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-02
      相关资源
      最近更新 更多