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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 19:54:00