
本文详解如何在 php + mysql 的 crud 系统中实现“仅文章作者可删除”权限控制,通过用户 id 关联与 sql 条件校验,防止越权删除,保障数据安全。
本文详解如何在 php + mysql 的 crud 系统中实现“仅文章作者可删除”权限控制,通过用户 id 关联与 sql 条件校验,防止越权删除,保障数据安全。
在构建用户内容管理(如任务、博客、笔记等)系统时,一个核心安全原则是:用户只能操作自己创建的数据。当前代码中直接通过 $_GET['id'] 删除记录,未校验请求者身份,存在严重的越权风险(例如用户手动修改 URL 中的 id 即可删除他人文章)。必须引入用户身份绑定与服务端鉴权。
✅ 正确做法:基于用户 ID 的双重校验
假设你的 task 表结构已扩展,包含 user_id 字段(类型为 INT,外键关联 users 表的 id),且用户登录后其 ID 已安全存入 Session(如 $_SESSION['user_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 同时匹配 post id 和所属 user_id
$query = "DELETE FROM task WHERE id = ? AND user_id = ?";
// ✅ 推荐使用预处理语句(更安全、更专业)
if ($stmt = mysqli_prepare($conn, $query)) {
mysqli_stmt_bind_param($stmt, "ii", $id, $user_id);
$result = mysqli_stmt_execute($stmt);
mysqli_stmt_close($stmt);
if ($result && mysqli_affected_rows($conn) > 0) {
$_SESSION['message'] = '任务删除成功';
$_SESSION['message_type'] = 'success';
} else {
$_SESSION['message'] = '删除失败:无权操作或记录不存在';
$_SESSION['message_type'] = 'danger';
}
} else {
die("预处理语句准备失败: " . mysqli_error($conn));
}
} else {
$_SESSION['message'] = '无效的删除请求';
$_SESSION['message_type'] = 'warning';
}
header('Location: index.php');
exit;
?>
⚠️ 重要注意事项
-
数据库设计前提:确保
task表中存在user_id字段,并在插入新任务时正确写入当前登录用户的 ID(如INSERT INTO task (title, content, user_id) VALUES (?, ?, ?)); -
Session 安全性:务必在所有涉及权限操作的脚本开头调用
session_start(),并验证$_SESSION['user_id']是否真实有效(建议配合 token 或角色字段二次校验); -
永远避免拼接 SQL:原始代码中
$query = "DELETE ... $id"属于高危写法,易受 SQL 注入攻击;务必改用预处理语句(如上示例)或至少对输入做强类型转换(如(int)$id); -
前端不可信:即使隐藏了删除按钮(如
if ($post['user_id'] == $_SESSION['user_id'])),后端仍必须重复校验——前端限制仅用于用户体验,不能替代服务端鉴权。
? 额外建议:增强健壮性
- 删除前可先查询该记录是否存在且归属当前用户(
SELECT id FROM task WHERE id = ? AND user_id = ?),再执行删除,便于返回更精准的提示; - 记录操作日志(如
deleted_by,deleted_at字段),便于审计; - 对敏感操作(如删除)建议增加确认机制(如 POST 表单 + CSRF Token),防止误点或 CSRF 攻击。
遵循以上实践,即可安全、可靠地实现“用户仅可删除本人发布内容”的权限模型,显著提升应用安全性与用户体验。











