
本文讲解如何在 PHP MySQL 环境中限制删除操作,确保只有文章创建者(即登录用户)才能删除自己的帖子,通过校验 user_id 字段实现安全的权限控制。
本文讲解如何在 php mysql 环境中限制删除操作,确保只有文章创建者(即登录用户)才能删除自己的帖子,通过校验 `user_id` 字段实现安全的权限控制。
在构建用户内容管理(如博客、任务列表等)系统时,保障数据操作的安全性至关重要。当前代码中存在严重安全隐患:删除逻辑仅依赖 URL 中的 id 参数(如 ?id=5),未校验当前登录用户是否为该记录的创建者,攻击者可轻易伪造请求删除他人数据。
✅ 正确做法:基于用户身份的双重校验
假设你的 task 表已包含 user_id 字段(类型为 INT),且该字段外键关联至 users 表的 id,同时你已在用户登录后将用户 ID 存入会话(如 $_SESSION['user_id'] = $row['id'];),则应修改删除逻辑如下:
<?php include("db.php");
// 确保用户已登录
if (!isset($_SESSION['user_id'])) {
$_SESSION['message'] = '请先登录才能执行此操作';
$_SESSION['message_type'] = 'warning';
header('Location: login.php');
exit;
}
if (isset($_GET['id'])) {
$id = (int)$_GET['id']; // 强制转为整型,防止注入
$user_id = (int)$_SESSION['user_id'];
// 关键:WHERE 同时匹配 id 和 user_id
$query = "DELETE FROM task WHERE id = ? AND user_id = ?";
// 推荐使用预处理语句(防 SQL 注入)
$stmt = mysqli_prepare($conn, $query);
mysqli_stmt_bind_param($stmt, "ii", $id, $user_id);
if (mysqli_stmt_execute($stmt)) {
$affected = mysqli_stmt_affected_rows($stmt);
if ($affected === 0) {
$_SESSION['message'] = '删除失败:您无权删除该条目或记录不存在';
$_SESSION['message_type'] = 'danger';
} else {
$_SESSION['message'] = '任务删除成功';
$_SESSION['message_type'] = 'success';
}
} else {
$_SESSION['message'] = '数据库操作失败,请重试';
$_SESSION['message_type'] = 'danger';
}
mysqli_stmt_close($stmt);
header('Location: index.php');
exit;
}
?>
⚠️ 关键注意事项
-
永远不要拼接用户输入:原代码
$query = "DELETE ... $id"易受 SQL 注入攻击;务必改用预处理语句(如上所示)或至少对参数做强类型转换(如(int)$id)。 -
必须验证登录状态:在执行任何敏感操作前,检查
$_SESSION['user_id']是否存在且有效。 -
表结构前提:确保
task表中存在user_id字段,并在插入新任务时正确写入当前用户 ID(例如:INSERT INTO task(title, user_id) VALUES(?, ?))。 -
前端不可信:即使隐藏了删除按钮(如
<?php if($task['user_id'] == $_SESSION['user_id']): ?>),后端仍需严格校验——前端控制仅用于体验优化,不能替代服务端鉴权。
✅ 总结
权限控制的核心原则是「服务端强制校验」。仅靠前端隐藏或 JavaScript 判断完全不可靠。通过在 DELETE 语句中加入 AND user_id = ? 条件,并配合预处理与会话验证,即可安全、可靠地实现「用户仅可删己帖」的功能。这是 Web 应用基础但至关重要的安全实践。











