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); }
问题诊断与修复
核心问题
- 会话未开启:
login.inc.php中没有调用session_start(),导致无法读取$_SESSION["captcha_code"]变量,对比逻辑自然失效。 - 逻辑分支完全错误:验证码验证代码写在
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
相关产品推荐
相关产品推荐

