PHP环境下无法使用明文密码登录问题求助
登录验证问题修复方案
问题分析
- 加密类型确认:你数据库中的密码串
$2y$10$lMw3VSF7dQlIlnCjvWtrE.smQEslGBPFbvLxy0ROo1kPVzmmlj2ui是bcrypt加密格式(以$2y$为标识),并非MD5或SHA256。 - 代码核心问题:当前代码直接将用户输入的明文密码与数据库中存储的加密密码做字符串匹配,自然无法匹配成功;而输入加密串时,字符串完全一致,所以能登录。
- 额外风险:原代码存在严重的SQL注入漏洞,直接将POST参数拼接进SQL语句,极易被攻击。
修复后的代码
HTML部分(无需修改)
<div class="container-fluid"> <div class="row"> <div class="col-lg-4 offset-lg-4 mt-5"> <div class="card shadow"> <div class="card-body"> <center><img src="aset/login.jpg" style="max-width:300px;max-height:300px;" class=""></center> <h4 class="text-center">LogIn CPPT</h4> <hr> <form method="post" action=""> <label>Username</label> <input type="text" class="form-control" name="Username" autocomplete="off" required> <label>Password</label> <input type="password" class="form-control mb-3" name="Password" autocomplete="off" required> <center><a href="https://api.whatsapp.com/send?phone=6281290231840&text=Permisi,%20Saya%20lupa%20password%20aplikasi%20CPPT%20saya,%20mohon%20dikirimkan%20password%20baru.%20Terimakasih." target="_blank" class="mt-3">Lupa kata sandi?</a></center> <marquee class="text-danger"><b>RSU Amanah Sumpiuh, Banyumas, Jawa Tengah - Aplikasi Catatan Perkembangan Pasien Terintegrasi</b></marquee> <button class="btn btn-success mt-3 float-end" name="LOGIN" type="submit"><i class="fa fa-arrow-circle-right" aria-hidden="true"></i> Masuk</button> </form> </div> </div> </div> </div> </div>
PHP部分(核心修改)
<?php session_start(); // 确保开启会话,若之前已开启可忽略 if (isset($_POST['LOGIN'])) { $Username = $_POST['Username']; $Password = $_POST['Password']; // 使用预处理语句避免SQL注入 $stmt = mysqli_prepare($connection4, "SELECT * FROM RSUPengguna WHERE Username = ?"); mysqli_stmt_bind_param($stmt, "s", $Username); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); $user = mysqli_fetch_assoc($result); if ($user) { // 用password_verify验证明文密码与bcrypt哈希 if (password_verify($Password, $user['Password'])) { $_SESSION['Username'] = $Username; echo "<meta http-equiv=refresh content=0;URL='index.php'>"; } else { echo "<script type='text/javascript'>alert('Username atau Password Tidak Benar!');</script>"; echo "<meta http-equiv=refresh content=2;URL='login.php'>"; } } else { echo "<script type='text/javascript'>alert('Username atau Password Tidak Benar!');</script>"; echo "<meta http-equiv=refresh content=2;URL='login.php'>"; } } ?>
关键修改说明
- 加密验证:使用PHP内置的
password_verify()函数,该函数专门用于验证bcrypt哈希与明文密码的匹配,无需手动处理盐值和加密逻辑。 - SQL注入防护:采用预处理语句(
mysqli_prepare、mysqli_stmt_bind_param),避免直接拼接用户输入到SQL语句中,彻底杜绝SQL注入风险。 - 逻辑调整:先通过用户名查询用户信息,再对密码进行验证,而非直接在SQL中比对密码。
内容的提问来源于stack exchange,提问作者IMAM IHSANI
相关产品推荐
相关产品推荐

