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

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);
?>

额外说明

  1. 确保你的session.php里已经启动了session_start(),并且在用户登录时把用户ID存入了$_SESSION['user_id'](如果你的用户ID字段不是id,或者session键名不一样,记得对应调整)
  2. 数据库里的password字段长度要足够长(至少255位),因为password_hash生成的哈希值比较长
  3. 预处理语句能有效防止SQL注入,比直接拼接SQL安全得多

内容的提问来源于stack exchange,提问作者Justine Noob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:23:14