在表单验证中仅输入一次recaptcha失败?

时间:2011-11-26 13:49:44

标签: php captcha recaptcha

我有一个表格,里面有几个字段和一个重新编码代码。

当用户提交表单时,recaptcha字段将与服务器端的其他字段(PHP)一起进行验证。如果任何字段无效,则会将用户重定向到包含错误的同一表单。

然而,问题是:用户必须再次输入重新分配。

如果表单验证失败但验证码验证成功,有什么办法我不能要求用户再次输入recaptcha?

4 个答案:

答案 0 :(得分:3)

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

您还必须确保有效的重新访问cookie只能使用一次,因为如果不是这样,垃圾邮件发送者可以一次又一次地发送cookie信息并解决这个问题。

我的想法是在会话中存储时间戳,例如" recaptcha_success"然后检查时间戳是否不超过几分钟(根据您的需要)。如果不是,请通过再次验证来重新进行重新验证。如果表单有效,请删除密钥,以便下次用户想要使用表格时再次进入重新签名。

答案 1 :(得分:2)

没有看到你的代码或它是如何设置的,我能想到的最简单的事情就是使用PHP会话:

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

session_start();

foreach($_POST as $key=>$val)
{
   if($key == "captcha" || $_SESSION['captcha_valid'] != 1)
   {
      //validate captcha
      if(captcha is valid)
      {
         $_SESSION['captcha_valid'] = 1;
      }
    }
 }

包含表单

的文件
  session_start();

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

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

</form>

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您可以通过设置会话var来验证

<?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'];
    }
}

然后在html表单上执行类似的操作以显示验证码表单。

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

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

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

希望这会有所帮助。如果我错过了什么,请随时编辑答案。