PHP修改用户密码功能失效,请求修正update.php代码
修复你的PHP密码修改功能
嘿,我帮你把这段密码修改的代码给修正了——原代码里有好几个影响功能和安全的问题,咱们一个个解决:
原代码的核心问题
- 用了已经被PHP废弃的
mysql_*函数,这些函数不仅不安全,现在的PHP版本甚至可能直接不支持 - 查询语句里的
id=''是空值,根本没指定要修改哪个用户的密码(得从session里取当前登录用户的ID) - 没有验证旧密码是否正确,也没检查新密码和确认密码是否匹配
- 直接明文处理密码,这是严重的安全漏洞
修复后的完整代码
<?php // 顶部已引入session.php,确保session已经启动 session_start(); // 如果session.php里没启动,这里加上 // 改用mysqli扩展(替代废弃的mysql_*) $conn_db = mysqli_connect("localhost", "root", "", "registration") or die("数据库连接失败: " . mysqli_connect_error()); if(isset($_POST['update_password'])) { // 获取表单提交的值,做基本过滤 $old_password = trim($_POST['old_password']); $new_password = trim($_POST['new_password']); $confirm_password = trim($_POST['confirm_password']); // 从session获取当前登录用户的ID(假设session里存的是user_id,根据你的实际字段调整) $user_id = $_SESSION['user_id'] ?? ''; // 第一步:验证输入合法性 if(empty($old_password) || empty($new_password) || empty($confirm_password)) { echo "请填写所有必填字段"; exit; } if($new_password !== $confirm_password) { echo "新密码和确认密码不匹配"; exit; } if(strlen($new_password) < 6) { // 可以根据需求调整密码长度要求 echo "密码长度不能少于6位"; exit; } if(empty($user_id)) { echo "请先登录"; exit; } // 第二步:验证旧密码是否正确 $query = "SELECT password FROM member WHERE id = ?"; // 使用预处理语句防止SQL注入 $stmt = mysqli_prepare($conn_db, $query); mysqli_stmt_bind_param($stmt, "i", $user_id); mysqli_stmt_execute($stmt); mysqli_stmt_bind_result($stmt, $hashed_old_password); mysqli_stmt_fetch($stmt); mysqli_stmt_close($stmt); // 用password_verify验证旧密码(假设数据库里存的是password_hash生成的哈希值) if(!password_verify($old_password, $hashed_old_password)) { echo "旧密码不正确"; exit; } // 第三步:生成新密码的哈希值,更新到数据库 $hashed_new_password = password_hash($new_password, PASSWORD_DEFAULT); $update_query = "UPDATE member SET password = ? WHERE id = ?"; $update_stmt = mysqli_prepare($conn_db, $update_query); mysqli_stmt_bind_param($update_stmt, "si", $hashed_new_password, $user_id); if(mysqli_stmt_execute($update_stmt)) { echo "密码修改成功"; } else { echo "密码修改失败: " . mysqli_error($conn_db); } mysqli_stmt_close($update_stmt); } // 关闭数据库连接 mysqli_close($conn_db); ?>
额外说明
- 确保你的
session.php里已经启动了session_start(),并且在用户登录时把用户ID存入了$_SESSION['user_id'](如果你的用户ID字段不是id,或者session键名不一样,记得对应调整) - 数据库里的
password字段长度要足够长(至少255位),因为password_hash生成的哈希值比较长 - 预处理语句能有效防止SQL注入,比直接拼接SQL安全得多
内容的提问来源于stack exchange,提问作者Justine Noob
相关产品推荐
相关产品推荐

