MySQLi注册表单存入明文密码而非加密密码的问题求助
修复MySQLi注册表单的密码加密存储问题
看起来你已经正确用password_hash()生成了加密密码,但核心问题是插入数据库时误用了明文密码的$password变量,而不是加密后的$h_password。下面是修正后的完整可运行代码:
<?php require('library/sql/db.php'); if (isset($_POST['submit'])) { // 过滤并转义用户输入,避免SQL注入 $username = mysqli_real_escape_string($db, trim($_POST['username'])); $password = mysqli_real_escape_string($db, trim($_POST['password'])); // 生成安全的密码哈希(使用PHP默认的强算法,当前为bcrypt) $h_password = password_hash($password, PASSWORD_DEFAULT); // 关键修正:插入语句中使用加密后的$h_password,而非明文$password $sql = "INSERT INTO users (username, password) VALUES ('$username', '$h_password')"; if (mysqli_query($db, $sql)) { echo "注册成功!"; } else { // 调试阶段可以输出错误信息,上线后建议替换为友好提示 echo "注册失败:" . mysqli_error($db); } // 关闭数据库连接(如果db.php中未自动处理) mysqli_close($db); } ?> <!-- 配套的HTML注册表单示例 --> <form method="POST" action=""> <label>用户名:</label> <input type="text" name="username" required><br> <label>密码:</label> <input type="password" name="password" required><br> <button type="submit" name="submit">完成注册</button> </form>
关键注意事项:
- 数据库字段配置:确保
users表的password字段类型设置为VARCHAR(255)——PASSWORD_DEFAULT生成的哈希最长为60字符,预留足够长度可避免哈希被截断导致验证失败。 - 登录验证逻辑:后续用户登录时,必须使用
password_verify()函数匹配明文密码与数据库中的哈希,示例代码如下:// 登录验证示例 $login_password = $_POST['login_password']; $stored_hash = // 从数据库查询到的该用户的password字段值 if (password_verify($login_password, $stored_hash)) { echo "登录成功"; } else { echo "密码错误"; } - 不要自行修改哈希逻辑:
password_hash()已经自动处理了加盐和强算法选择,无需手动添加盐值或调整算法参数,这是PHP官方推荐的安全方案。
内容的提问来源于stack exchange,提问作者ItzBlazik
相关产品推荐
相关产品推荐

