防范越权漏洞的核心是服务端强制校验用户权限,不依赖前端控制或参数猜测;每次请求须做身份与权限双重校验,关键逻辑入口明确授权判断,数据库查询加入用户归属条件,角色操作前验证权限位,禁用客户端传入的身份线索,敏感操作需二次确认与日志记录。

防范越权漏洞,核心是**服务端强制校验用户权限,不依赖前端控制或参数猜测**。PHP原生开发中,越权(如水平越权、垂直越权)往往因开发者“信任请求参数”或“省略权限检查”导致,比如直接用GET id=123就返回对应数据,却不验证当前用户是否有权访问该ID的资源。
每次请求都做身份与权限双重校验
不能只靠登录态(如$_SESSION['user_id']存在)就放行操作。必须在关键逻辑入口明确判断:当前用户是否被授权执行本次请求。
- 对用户专属资源(如订单、文章、设置页),查询数据库时务必加入用户归属条件:
$stmt = $pdo->prepare("SELECT * FROM orders WHERE id = ? AND user_id = ?");<br>$stmt->execute([$order_id, $_SESSION['user_id']]); - 对角色敏感操作(如后台删除用户、导出报表),先查用户角色或权限位:
if (!in_array($_SESSION['role'], ['admin', 'manager'])) { die('无权限'); } - 避免用“隐藏字段”或“URL参数”传递权限标识,所有判定逻辑必须在服务端完成,且不可绕过。
使用白名单控制可访问资源范围
不要用“黑名单”方式排除非法ID,而应从设计上限制用户能操作的数据边界。
- 用户列表页分页、搜索结果,只查该用户有权限看到的数据,而不是查全表再前端过滤;
- API接口返回字段也需按权限裁剪,比如普通用户看不到管理员字段
is_deleted或last_login_ip; - 文件下载、图片预览等资源访问,不直接暴露真实路径,改用ID映射+权限检查:
if (!canAccessFile($_SESSION['user_id'], $file_id)) { http_response_code(403); exit; }
敏感操作引入二次确认与操作日志
越权常伴随高危动作(删账号、改密码、转账)。仅靠一次权限检查不够,需叠加行为约束。
- 修改关键信息前,要求重新输入密码或验证短信/邮箱;
- 所有越权易发操作(如
/api/user/delete)记录完整日志:谁、何时、对谁、做了什么、IP、User-Agent; - 对异常高频请求(如1分钟内连续访问10个不同用户ID)触发临时限流或告警。
避免依赖客户端传来的“身份线索”
禁止用$_GET['user_id']、$_POST['target_role']等参数决定权限主体——这些全可被篡改。
- 用户身份只应来自可信会话(
$_SESSION)或已签名的Token(如JWT),且每次解密后需校验签名校验和有效期; - 禁止在URL里暴露权限等级,例如
?type=admin或&level=9; - 若必须传递资源标识,用不可预测的随机字符串(如UUID)代替自增ID,并在数据库中建立映射关系。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











