Php 表单验证失败时仅输入一次recaptcha?

Php 表单验证失败时仅输入一次recaptcha?,php,captcha,recaptcha,Php,Captcha,Recaptcha,我有一个表单,它有几个字段,最后有一个recaptcha代码 当用户提交表单时,将验证recaptcha字段以及服务器端(PHP)上的其他字段。如果任何字段无效,则会将用户重定向到同一表单,并出现错误 然而,问题是:用户必须再次输入recatpcha 如果表单验证失败但验证码验证成功,是否有任何方法不能要求用户再次输入recaptcha?是-设置成功输入验证码的会话变量,不显示recaptcha表单。是-设置成功输入验证码的会话变量,不显示recaptcha表单回顾一下表单。没有看到您的代码或它

我有一个表单,它有几个字段,最后有一个recaptcha代码

当用户提交表单时,将验证recaptcha字段以及服务器端(PHP)上的其他字段。如果任何字段无效,则会将用户重定向到同一表单,并出现错误

然而,问题是:用户必须再次输入recatpcha


如果表单验证失败但验证码验证成功,是否有任何方法不能要求用户再次输入recaptcha?

是-设置成功输入验证码的会话变量,不显示recaptcha表单。

是-设置成功输入验证码的会话变量,不显示recaptcha表单回顾一下表单。

没有看到您的代码或它的设置方式。我能想到的最简单的事情就是使用PHP会话:

<?php
 if (!isset($_SESSION['human_signup']) || (time() - $_SESSION['human_signup'] > 300)){ ?>
<label class="control-label">CAPTCHA</label>
<script type="text/javascript"> var RecaptchaOptions = {theme : 'white' }; </script>
<script type="text/javascript" src="http://www.google.com/recaptcha/api/challenge?k=your key"></script>
  <noscript>
     <iframe src="http://www.google.com/recaptcha/api/noscript?k=your key"
         height="300" width="500" frameborder="0"></iframe><br>
     <textarea name="recaptcha_challenge_field" rows="3" cols="40">
     </textarea>
     <input type="hidden" name="recaptcha_response_field"
         value="manual_challenge">
  </noscript>
<? } ?> 
接收表单数据的文件(假定为POST)

包含表单的文件

  session_start();

echo "<form method='yourphpfile.php' method='post'>"

    if(!isset($_SESSION['captcha_valid']) || $_SESSION['captcha_valid'] != 1)
    {
       //add captcha code
    }

</form>
session_start();
回声“”
如果(!isset($_会话['captcha_valid'])|$_会话['captcha_valid']!=1)
{
//添加验证码
}

在看不到您的代码或如何设置代码的情况下,我能想到的最简单的事情就是使用PHP会话:

接收表单数据的文件(假定为POST)

包含表单的文件

  session_start();

echo "<form method='yourphpfile.php' method='post'>"

    if(!isset($_SESSION['captcha_valid']) || $_SESSION['captcha_valid'] != 1)
    {
       //add captcha code
    }

</form>
session_start();
回声“”
如果(!isset($_会话['captcha_valid'])|$_会话['captcha_valid']!=1)
{
//添加验证码
}

当然有。您可以将recaptcha的验证成功存储到会话(或cookie或数据库)中,然后在有指示的情况下隐藏recaptcha。在服务器端,您只需检查recaptcha是否正确或指示是否有效

您还必须确保有效的recaptcha cookie只能使用一次,因为如果不能使用,垃圾邮件发送者只需反复发送cookie信息,并处理recaptcha


我的想法是将时间戳存储在会话中的“recaptcha_success”这样的键下,然后检查时间戳是否不超过几分钟(根据您的需要)。如果不是,则通过不再验证来解决recaptcha。如果表单有效,请删除该键,以便用户下次要使用表单时必须再次输入recaptcha。

确实有。您可以将recaptcha的验证成功存储到会话(或cookie或数据库)中,然后在有指示的情况下隐藏recaptcha。在服务器端,您只需检查recaptcha是否正确或指示是否有效

您还必须确保有效的recaptcha cookie只能使用一次,因为如果不能使用,垃圾邮件发送者只需反复发送cookie信息,并处理recaptcha


我的想法是将时间戳存储在会话中的“recaptcha_success”这样的键下,然后检查时间戳是否不超过几分钟(根据您的需要)。如果不是,则通过不再验证来解决recaptcha。如果表单有效,请删除该键,以便用户下次要使用表单时必须再次输入recaptcha。

您可以通过如下设置会话变量进行验证

<?php
// captcha is already submitted so no need to verify again,
if(!isset($_SESSION['human_signup']) || (time() - $_SESSION['human_signup'] > 300)){

    require_once('admin/recaptcha/recaptchalib.php');

    // Get a key from https://www.google.com/recaptcha/admin/create
    $publickey = 'your publickey';
    $privatekey = 'your privatekey';


    # the response from reCAPTCHA
    $resp = null;

    $resp = recaptcha_check_answer ($privatekey,
                                $_SERVER["REMOTE_ADDR"],
                                $_POST["recaptcha_challenge_field"],
                                $_POST["recaptcha_response_field"]);

    if (!$resp->is_valid) {
    // What happens when the CAPTCHA was entered incorrectly 
    $errors[] = 'The CAPTCHA wasn\'t entered correctly, please try again';
    }else{
    $_SESSION['human_signup'] = time();
    $_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT'];
    }
}

验证码
var RecaptchaOptions={theme:'white'};

确保用户注册完成后删除会话。像这样

<?php
//insert registration data in db i.e. registration is complete.
//unset the session used to hide the captcha.   
unset($_SESSION['human_signup']); 
?>

一个不太重要的功能是阻止用户手动输入验证码,然后使用一些脚本自动创建帐户

/* if user tries to  register automatically by manually entering captcha and using scrpt to create accoutns */
<?php
if(isset($_SESSION['human_signup']) && ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT'])) {
    unset($_SESSION['human_signup']);
    unset($_SESSION['user_agent']);
@session_destroy();
@session_unset();
}
?>
/*如果用户试图通过手动输入验证码并使用scrpt创建帐户来自动注册*/

希望这有帮助。如果我遗漏了什么,请随意编辑答案。

您可以通过这样设置会话变量进行验证

<?php
// captcha is already submitted so no need to verify again,
if(!isset($_SESSION['human_signup']) || (time() - $_SESSION['human_signup'] > 300)){

    require_once('admin/recaptcha/recaptchalib.php');

    // Get a key from https://www.google.com/recaptcha/admin/create
    $publickey = 'your publickey';
    $privatekey = 'your privatekey';


    # the response from reCAPTCHA
    $resp = null;

    $resp = recaptcha_check_answer ($privatekey,
                                $_SERVER["REMOTE_ADDR"],
                                $_POST["recaptcha_challenge_field"],
                                $_POST["recaptcha_response_field"]);

    if (!$resp->is_valid) {
    // What happens when the CAPTCHA was entered incorrectly 
    $errors[] = 'The CAPTCHA wasn\'t entered correctly, please try again';
    }else{
    $_SESSION['human_signup'] = time();
    $_SESSION['user_agent'] = $_SERVER['HTTP_USER_AGENT'];
    }
}

验证码
var RecaptchaOptions={theme:'white'};

确保用户注册完成后删除会话。像这样

<?php
//insert registration data in db i.e. registration is complete.
//unset the session used to hide the captcha.   
unset($_SESSION['human_signup']); 
?>

一个不太重要的功能是阻止用户手动输入验证码,然后使用一些脚本自动创建帐户

/* if user tries to  register automatically by manually entering captcha and using scrpt to create accoutns */
<?php
if(isset($_SESSION['human_signup']) && ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT'])) {
    unset($_SESSION['human_signup']);
    unset($_SESSION['user_agent']);
@session_destroy();
@session_unset();
}
?>
/*如果用户试图通过手动输入验证码并使用scrpt创建帐户来自动注册*/

希望这有帮助。如果我遗漏了什么,请随意编辑答案。

在您的PHP中,您还必须检查是否设置了captcha\u valid(验证码有效或$\u会话['captcha\u valid')==1)。还要确保检查验证码是否是他们的,或者验证码是否有效设置为1,否则如果没有发送验证码,表单将被视为有效。如果$\u会话['captcha\u valid']==1,则表单将不显示验证码字段,因此在POST vars中将没有“验证码”所以如果我从请求中手动删除验证码,php代码会认为我之前输入的验证码是正确的?因为我不是垃圾邮件发送者,我不知道他们是否试图根本不发送任何验证码信息,但是如果他们这样做,你的实现将使验证码无效。啊,我明白你的意思了ing-是的,需要进行该检查才能添加安全性。我将编辑帖子以反映这一点。在PHP中,您还必须检查是否设置了验证码有效,因此如果(验证码有效或$会话['captcha\u有效'),它将是
if(验证码有效)==1)
。还要确保检查验证码是否是他们的,或者验证码是否有效设置为1,否则如果没有发送验证码,表单将被视为有效。如果$\u会话['captcha\u valid']==1,则表单将不显示验证码字段,因此在POST vars中将没有“验证码”因此,如果我手动从请求中删除验证码,php代码将假定我之前输入的验证码是正确的?因为我不是垃圾邮件发送者,我不知道他们是否试图根本不发送任何验证码信息,但不是