
本文介绍通过会话验证与参数校验相结合的方式,确保登录用户只能访问自身数据,杜绝url参数篡改导致的越权访问(insecure direct object reference, idor)漏洞。
本文介绍通过会话验证与参数校验相结合的方式,确保登录用户只能访问自身数据,杜绝url参数篡改导致的越权访问(insecure direct object reference, idor)漏洞。
在Web应用中,仅依赖URL参数(如 ?stid=55)控制数据可见性是严重安全隐患——攻击者只需修改ID即可非法访问他人信息。真正的防护必须基于服务端身份认证与授权校验,而非前端或URL层面的信任。
✅ 正确做法:双重保障机制
- 登录后将用户唯一标识存入 Session(如 $_SESSION['user_id']);
- 从数据库查询时,始终以 Session 中的用户ID为依据,而非直接信任URL参数;
- 若需保留URL参数用于导航等目的,则必须严格校验其合法性。
✅ 推荐方案(推荐):忽略URL参数,以Session为准
<?php session_start();
// 1. 检查用户是否已登录
if (!isset($_SESSION['user_id']) || !is_numeric($_SESSION['user_id'])) {
http_response_code(403);
die("Access denied: Not authenticated.");
}
$logged_in_id = (int)$_SESSION['user_id'];
// 2. 直接根据登录用户ID查询(不使用 $_GET['stid']!)
$stmt = $pdo->prepare("SELECT * FROM alumni WHERE id = ?");
$stmt->execute([$logged_in_id]);
$userData = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$userData) {
http_response_code(404);
die("User data not found.");
}
// 3. 安全渲染数据
echo "<h2>Welcome, {$userData['name']}!</h2>";
echo "<p>Email: {$userData['email']}</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill8260" title="Ai Session Analysis"><img
src="https://img.php.cn/upload/skill/000/000/081/179195234256961.jpg" alt="Ai Session Analysis" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill8260" title="Ai Session Analysis" class="overflowclass">Ai Session Analysis</a>
<p class="overflowclass">用于分析本地AI编程助手会话数据(如Claude Code、Codex、Kimi Code)。当用户请求分析编程会话时触发。</p>
</div>
<a rel="nofollow" href="/xiazai/skill8260" title="Ai Session Analysis" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>";
?>
⚠️ 备选方案(仅当业务强制需支持多用户查看时):严格校验URL参数
<?php session_start();
if (!isset($_SESSION['user_id']) || !isset($_GET['stid'])) {
http_response_code(403);
die("Access denied.");
}
$logged_in_id = (int)$_SESSION['user_id'];
$request_id = (int)$_GET['stid'];
// 强制校验:仅允许查看自己的数据
if ($logged_in_id !== $request_id) {
http_response_code(403);
error_log("IDOR attempt: user {$logged_in_id} tried accessing stid={$request_id}");
die("You are not authorized to view this data.");
}
// 此时可安全查询
$stmt = $pdo->prepare("SELECT * FROM alumni WHERE id = ?");
$stmt->execute([$request_id]);
$userData = $stmt->fetch(PDO::FETCH_ASSOC);
?>
? 关键注意事项
- 永远不要信任客户端输入:$_GET, $_POST, $_COOKIE 均可被恶意篡改;
- Session 必须在每次请求开始时启动并验证(session_start() + 权限检查);
- 使用预处理语句(PDO/MySQLi)防止SQL注入,避免拼接 $stid 到SQL中;
- 记录越权访问尝试(如写入日志),便于安全审计;
- 生产环境禁用错误回显(display_errors = Off),避免泄露敏感路径或结构。
✅ 总结
防止越权访问的核心原则是:“以身份为中心,而非以参数为中心”。只要坚持用 $_SESSION['user_id'] 作为数据访问的唯一可信依据,并配合严格的会话管理和输入校验,即可彻底规避此类IDOR风险。URL中的 stid 参数应被视为冗余或仅用于前端展示,绝不参与权限决策逻辑。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










