如何防止用户通过URL篡改ID越权编辑休假类型与直接访问页面?
解决越权编辑休假记录的方案
你之前添加的脚本仅用于防止直接通过URL访问文件本身,并未针对用户权限与休假记录归属做校验,所以无法阻止越权操作。要解决这个问题,核心是在edit_leave.php中验证当前登录用户是否有权限编辑指定ID的休假记录,具体实现步骤如下:
1. 确保用户已登录并获取当前用户标识
先通过会话确认用户处于登录状态,若未登录则跳转至登录页面:
session_start(); // 根据你的登录逻辑调整判断条件 if (!isset($_SESSION['user_id'])) { header('Location: login.php'); exit(); } $current_user_id = $_SESSION['user_id'];
2. 校验URL中休假ID的合法性
获取并过滤URL里的edit参数(注意你原链接写的是delete=id,大概率是笔误,正确链接应该是<a href="edit_leave.php?edit=<?php echo $leave_id; ?>">编辑</a>),再查询该ID对应的休假记录所属用户:
// 过滤参数,防止非法输入与SQL注入 if (!isset($_GET['edit']) || !is_numeric($_GET['edit'])) { header('HTTP/1.0 400 Bad Request'); die('无效的请求参数'); } $leave_id = intval($_GET['edit']); // 连接数据库(根据你的实际配置修改) $conn = mysqli_connect('localhost', 'db_username', 'db_password', 'db_name'); if (!$conn) { die('数据库连接失败: ' . mysqli_connect_error()); } // 用预处理语句查询记录所属用户ID,避免SQL注入 $query = "SELECT user_id FROM leave_records WHERE id = ?"; $stmt = mysqli_prepare($conn, $query); mysqli_stmt_bind_param($stmt, 'i', $leave_id); mysqli_stmt_execute($stmt); mysqli_stmt_bind_result($stmt, $record_user_id); mysqli_stmt_fetch($stmt); mysqli_stmt_close($stmt); mysqli_close($conn);
3. 验证权限并处理结果
对比当前用户ID与记录所属用户ID,若不匹配则拒绝访问:
// 如果是管理员角色,可额外添加判断允许编辑所有记录 if ($record_user_id !== $current_user_id) { header('HTTP/1.0 403 Forbidden'); die('你没有权限编辑该休假记录'); } // 权限校验通过,执行后续编辑页面逻辑 // ... 你的编辑功能代码 ...
额外安全建议
- 坚持使用预处理语句:上述查询采用了mysqli预处理语句,能有效防范SQL注入攻击,避免恶意构造ID参数破坏数据库。
- 减少敏感参数暴露:尽量避免在URL中直接明文传递ID,可改用POST请求传递,或对ID进行可逆加密处理(需保证加密逻辑安全)。
- 完善角色权限逻辑:若系统存在管理员角色,需在权限校验中添加角色判断,允许管理员编辑所有休假记录:
// 假设会话中存储了用户角色,例如$_SESSION['role'] = 'admin' if ($_SESSION['role'] !== 'admin' && $record_user_id !== $current_user_id) { header('HTTP/1.0 403 Forbidden'); die('你没有权限编辑该休假记录'); }
内容的提问来源于stack exchange,提问作者Eliud Karanja Ndiritu
相关产品推荐
相关产品推荐

