越权访问漏洞需立即修复:先定位未鉴权路由和缺失归属校验的控制器方法,再为敏感路由绑定auth/can中间件,并在业务逻辑中用where('user_id', auth::id())二次校验,最后统一返回403避免信息泄露。

发现PHP框架项目中用户能随意访问他人订单、修改他人资料、查看未授权的后台接口,说明存在越权访问漏洞,必须立即定位并修复。
确认是否存在未校验用户身份的路由
打开框架的路由定义文件(如Laravel的routes/web.php或ThinkPHP的route/route.php),搜索所有含id、uid、order_no等动态参数的GET/POST路由,重点标记未包裹在中间件鉴权逻辑中的条目。
例如找到Route::get('/profile/{id}', [ProfileController::class, 'show']);却没加->middleware('auth'),这就是高危路径。
检查控制器方法是否跳过用户上下文比对
定位到上一步发现的可疑路由对应的方法,比如ProfileController@show。
查看方法体内是否直接使用$request->route('id')或$id参数查询数据库,而没有调用Auth::id()、$this->user()->id或session('user_id')进行归属校验。
若代码形如$profile = Profile::find($id); return response($profile);,则漏洞已复现——攻击者只需把URL中的/profile/123改成/profile/456就能读取任意用户档案。
测试垂直越权:普通用户调用管理员接口
方法一:手动抓包重放
用浏览器登录普通用户账号,打开开发者工具→Network,触发一个管理员才有的操作(如访问/admin/users),复制该请求的完整cURL命令或原始HTTP请求;再用Postman或curl,保持Cookie不变,直接发送该请求。
方法二:伪造JWT或Session ID(仅适用于Token鉴权场景)
若系统使用JWT,在请求头中将Authorization: Bearer xxx的token解码,检查role字段是否为"user";然后尝试把role改为"admin"并重签(需掌握密钥才可成功,但可验证服务端是否校验签名有效性)。
【关键前提】测试前必须确认目标环境为测试服或已获书面授权,禁止在生产环境发起未授权越权探测】
修复越权访问漏洞
第一步:为敏感路由强制绑定权限中间件
Laravel中在路由定义末尾追加->middleware(['auth', 'can:view,App\Models\Profile']);ThinkPHP中在route.php对应规则后添加['middleware' => ['auth', 'role:admin']]。
第二步:在控制器方法内增加显式归属判断
不要只依赖中间件,要在业务逻辑里二次校验。例如获取订单时写:$order = Order::where('id', $id)->where('user_id', Auth::id())->firstOrFail();。这样即使中间件被绕过,数据库查询层仍会拦截非法请求。
第三步:统一响应处理,避免信息泄露
当归属校验失败时,返回403 Forbidden或通用错误提示(如“记录不存在”),而不是404 Not Found——后者可能被用于枚举用户ID是否存在。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











