【问题标题】:PHP : Captcha verification code not working properly;PHP : Captcha 验证码无法正常工作;
【发布时间】:2015-07-07 05:36:24
【问题描述】:

我正在创建一个非常简单的验证码验证过程。

(当用户尝试登录我的网站 3 次但均未成功时,他会被重定向到验证码页面(captcha.php),以验证他不是垃圾邮件机器人)

验证码值本身是由一串字母和数字随机生成的。一共6位数。

然后,我将此值与用户在文本框中输入的值进行比较。如果值匹配,用户可以继续。如果不是,则页面重新加载,显示错误消息,并生成新的验证码。

非常简单。没有javascript,没有ajax。

除了一件事:如果用户提供正确的值,验证码不会重定向。

相反,它每次都会给出错误消息。

  <?php session_start();

   include 'database_connect.php';

   function getRandomString($length)  {
   $validCharacters =  
   "ABCDEFGHIJKLMNPQRSTUVWXYZ123456789";
    $validCharNumber = strlen($validCharacters);
    $result = "";

    for ($i = 0; $i < $length; $i++) {
    $index = mt_rand(0, $validCharNumber - 1);
    $result .= $validCharacters[$index];
    }
    return $result; }

    $captcha_value = getRandomString(6);

    ?>

   <!DOCTYPE html>
   <html>
   <head>
        <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
        <META HTTP-EQUIV="Cache-Control" CONTENT="no-store">
        <META HTTP-EQUIV="Pragma" CONTENT="no-cache">
        <META HTTP-EQUIV="Expires" CONTENT="0">
        <META CHARSET="UTF-8">      
        <title>Captcha Test</title>         
  </head>
 <body>
    <fieldset><legend>CAPTCHA :</legend>

     <?php 
            if (isset($_POST['submit'])) {

                $post_captcha = $_POST['captcha'];

                if ($post_captcha == $captcha_value) {

                $clear_failed_logins =  mysqli_query($conn,("Delete FROM 
                                        login_attempts where login = 
                                        '$_POST[login]'")) 
                                        or die(mysqli_error($conn)); 

                header ("Location: /example.com/login.php");    
                exit();     
            }
            else {

            echo "<p style='color:red; font-weight:bold;'>The value you  
                   entered is not correct! Please try again.</p>";
             }
          }
        ?> 

        <p>Please input the characters you see into the text-box below :</p>
        <p>  <?= $captcha_value ?> </p>
        <form method="POST" action="captcha.php">
        <input type="text" name="captcha" id="captcha" size=10 
                     autocomplete="off" required><br><br><br> 
        <input type="submit" name="submit" id="submit" value="SUBMIT"> 
        </form>
    </fieldset> 

【问题讨论】:

  • 是的,因为在提交表单后它会再次为$captcha_value生成一个新值
  • 因为第一次加载页面时没有设置提交。这就是它显示错误消息的原因。您必须更改条件并引入更多错误检查变量。

标签: php captcha


【解决方案1】:

在向用户输出某些内容后,您无法在 php 中使用 header 进行重定向,因此请在输出某些内容之前将 if else 块移动到页面顶部。 如果您想在此位置重定向,请尝试元刷新

 <meta http-equiv="refresh" content="0; URL=http://www.domain.com">

此外,您应该将验证码值存储在表单中,因为每次刷新页面时都会重新生成它(因此在表单提交之后),我建议您使用reCaptcha 尝试它,这很容易实现并且更多安全

【讨论】:

  • 感谢您的回复,洛基。我确实在页面顶部有 IF-ELSE 块,但它不起作用($captcha_value 没有生成,因为它只出现在 if-else 之后)。这就是为什么我把它移到现在的位置。我需要 IF-ELSE 块中的 $captcha_value。如何正确定位?
  • 您可以使用隐藏输入 这也很糟糕,因为用户或机器人可以在源代码中看到这一点代码
  • 我的意思是:如何重新定位 IF-ELSE 块
  • 您需要正确的验证码值,因此您可以将其存储在会话/cookie 中,或者像我上面所说的那样,以您可以相互检查的形式进行检查,因此 $_POST["captcha"] = == $_POST["captchavalue"] 或者如果您生成验证码,则使用会话 $_SESSION["captcha"] = $captcha_value;然后如果你检查它是否正确 $_SESSION["captcha"] === $_POST["captcha"]
  • 谢谢,但正如我之前提到的,我已经这样做了。如果 IF-ELSE 条件位于错误的位置,使用 SESSION 或 COOKIE 不会改变任何内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多