You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP验证码验证通过仍无法登录问题排查

验证码验证失败问题排查与修复

我开发了一个带验证码的简易登录表单(包含邮箱/用户名、密码字段),验证码每次刷新页面时随机生成并存储在$_SESSION["captcha_code"]中,用户输入的验证码通过POST提交。登录时需要验证$_SESSION["captcha_code"]和$_POST["captcha_code"]是否相等,但即使两者值完全一致,仍无法完成登录,返回“Captcha incorrect!”错误提示。我添加了测试参数确认两个变量值相同,但问题依旧。

相关代码

login.php

<?php
session_start();
?>
<section class="login-form">
      <form action="includes/login.inc.php" method="post">
        <input type="text" name="name" id="name" placeholder="Nom de l'utilisateur/Email...."><br><br>
        <input type="password" name="pwd" id="pwd" placeholder="Mot de passe...."><br><br>

        <!-- ======= Captcha Section ======= -->
        <table class="table table-bordered" style="width:40%;margin:0 auto;">
          <div class="form-group">
            <tr>
              <td colspan="3" style="width:10%;">
                <img src="includes/captcha-gen.inc.php" />
              </td>
              <td colspan="3" style="width:10%;">
                <input type="text" name="captcha_code" class="form-control" autocomplete="off" />
              </td>
            </tr>
          </div>
        </table>

        <div class="form-group">
          <input type="submit" id="login" name="submit" value="Connecter" class="btn btn-success" />
        </div>
      </form>

      <?php
      if (isset($_GET["error"])) {
        if ($_GET["error"] == "emptyinput") {
          echo "<p style='color:red;'>Remplissez tous les champs!</p>";
        } else if ($_GET["error"] == "wronglogin") {
          echo "<p style='color:red;'>Login incorrect!</p>";
        } else if ($_GET["error"] == "incorrectCaptcha") {
          echo "<p style='color:red;'>Captcha incorrect!</p>";
        }
      }
      ?>
</section>

login.inc.php

if (isset($_POST["submit"])) {
    $username = $_POST["name"];
    $pwd = $_POST["pwd"];
        // 存储表单提交的验证码
    $captcha = $_POST["captcha_code"];

        // 数据库连接
    require_once 'dbh.inc.php';

        // 包含loginUser函数的文件
    require_once 'functions.inc.php';

    // 错误处理与登录逻辑
    if (emptyInputLogin($username, $pwd) !== false) {
        header("location: ../login.php?error=emptyinput");
        exit();
                // 测试:对比会话中的验证码和表单提交的验证码
        if ($captcha == $_SESSION["captcha_code"]) {
            loginUser($pdo, $username, $pwd);
        }
    } else {
        header("location: ../login.php?error=incorrectCaptcha");
    }
} else {

    header("location: ../login.php");
}
?>

测试情况

我添加了以下测试代码,确认$_SESSION["captcha_code"]和$_POST["captcha_code"]值完全一致,但页面仍跳转到错误提示页面:

} else {
        header("location: ../login.php?error=incorrectCaptcha".'/'.$_SESSION["captcha_code"].'-'.$captcha);
    }

问题诊断与修复

核心问题

  1. 会话未开启:login.inc.php中没有调用session_start(),导致无法读取$_SESSION["captcha_code"]变量,对比逻辑自然失效。
  2. 逻辑分支完全错误:验证码验证代码写在exit()之后,永远不会被执行;同时当前逻辑把「输入不为空」的情况直接判定为验证码错误,逻辑完全颠倒。

修复后的login.inc.php代码

<?php
session_start(); // 必须开启会话才能读取SESSION变量

if (isset($_POST["submit"])) {
    $username = $_POST["name"];
    $pwd = $_POST["pwd"];
    $captcha = $_POST["captcha_code"];

    require_once 'dbh.inc.php';
    require_once 'functions.inc.php';

    // 第一步:检查所有输入是否为空(建议加入验证码的空值检查)
    if (emptyInputLogin($username, $pwd, $captcha) !== false) {
        header("location: ../login.php?error=emptyinput");
        exit();
    }

    // 第二步:验证验证码
    if ($captcha !== $_SESSION["captcha_code"]) {
        header("location: ../login.php?error=incorrectCaptcha");
        exit();
    }

    // 第三步:验证码验证通过,执行登录逻辑
    loginUser($pdo, $username, $pwd);
} else {
    header("location: ../login.php");
}
?>

额外优化建议

  • 更新emptyInputLogin函数,加入对$captcha的空值检查,避免用户未输入验证码就提交。
  • 验证码验证通过后,销毁会话中的验证码(unset($_SESSION["captcha_code"])),防止重复使用同一验证码登录。
  • 若验证码不区分大小写,可使用strcasecmp($captcha, $_SESSION["captcha_code"]) !== 0进行对比,提升用户体验。

内容的提问来源于stack exchange,提问作者AHmed Chercheri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 16:43:11