PHP站点如何实现用户仅可编辑、删除自身账号信息
核心实现逻辑
权限控制的核心是登录后将用户唯一标识存储在服务端Session中,所有编辑、删除操作都以服务端存储的登录用户ID为校验基准,不要依赖前端传参或Cookie存储的用户身份信息,防止伪造篡改。
一、前置基础配置
所有需要登录后访问的页面(用户列表、编辑、删除页等)顶部必须先加登录状态校验:
<?php session_start(); // 未登录直接跳转登录页 if (!isset($_SESSION['login_user_id'])) { header("Location: login.php"); exit(); } // 存储当前登录用户的ID,后续所有权限校验都用这个值 $current_login_uid = $_SESSION['login_user_id']; ?>
登录页校验账号密码通过后,必须把当前用户的唯一主键ID写入Session:
// 假设数据库查询到的当前用户数据存在$user变量中,主键字段为id $_SESSION['login_user_id'] = $user['id']; $_SESSION['login_username'] = $user['username']; // 可额外存储用户名用于页面展示
二、用户列表页逻辑调整
- 可以展示所有用户信息,但只有列表项的用户ID和当前登录用户ID一致时,才展示编辑、删除按钮,减少普通用户的误操作入口:
<?php foreach ($user_list as $item): ?> <tr> <td><?php echo $item['username']; ?></td> <td><?php echo $item['email']; ?></td> <td> <?php if ($item['id'] == $current_login_uid): ?> <a href="edit.php?uid=<?php echo $item['id']; ?>">编辑</a> <a href="delete.php?uid=<?php echo $item['id']; ?>" onclick="return confirm('确认删除当前账号吗?')">删除</a> <?php endif; ?> </td> </tr> <?php endforeach; ?>
注意:前端隐藏按钮只是体验优化,后端操作页必须单独做权限校验,不能完全依赖前端控制,防止用户手动拼接URL操作其他账号。
三、编辑页权限校验逻辑
编辑页顶部加完基础登录校验后,要额外校验当前操作的用户ID是否和登录用户ID一致:
<?php session_start(); if (!isset($_SESSION['login_user_id'])) { header("Location: login.php"); exit(); } $current_login_uid = $_SESSION['login_user_id']; $edit_uid = intval($_GET['uid']); // 权限校验不通过直接拦截 if ($edit_uid != $current_login_uid) { die("无权限编辑其他用户信息"); } // 后续执行编辑逻辑,仅操作$edit_uid对应的用户数据即可 ?>
四、删除页修复&权限校验逻辑
删除功能失效大概率是缺少参数校验、权限校验,或者删除条件写错,完整实现逻辑如下:
<?php session_start(); // 1. 基础登录校验 if (!isset($_SESSION['login_user_id'])) { header("Location: login.php"); exit(); } $current_login_uid = $_SESSION['login_user_id']; // 2. 校验删除参数合法性 if (!isset($_GET['uid']) || !is_numeric($_GET['uid'])) { die("参数错误"); } $delete_uid = intval($_GET['uid']); // 3. 核心权限校验:要删除的用户ID必须等于当前登录用户ID if ($delete_uid != $current_login_uid) { die("无权限删除其他用户信息"); } // 4. 执行删除,用预处理语句防止SQL注入,示例为PDO写法 $pdo = 你的数据库连接实例; $stmt = $pdo->prepare("DELETE FROM 你的用户表名 WHERE id = ?"); $res = $stmt->execute([$delete_uid]); if ($res) { // 删除成功后销毁Session,跳转到登录页 session_destroy(); header("Location: login.php?msg=账号删除成功"); exit(); } else { die("删除失败,请重试"); } ?>
额外注意事项
- 所有数据库操作都要使用预处理语句,不要直接拼接SQL字符串,避免SQL注入风险
- 不要信任前端传递的任何身份参数,所有权限校验必须在服务端完成
- 可根据需求设置Session过期时间,降低账号长时间登录被盗用的风险
内容的提问来源于stack exchange,提问作者poop
相关产品推荐
相关产品推荐

