Laravel 12.x 无官方“模型绑定注入漏洞”,所谓问题实为开发者误用路由模型绑定导致的越权访问;修复需在绑定时加权限校验、作用域约束、禁用隐式绑定、避免敏感操作,并用中间件统一兜底。

明确绑定对象的归属权限
路由模型绑定默认只做“查得到就注入”,不管“该不该给你”。例如:
Route::get('/posts/{post}', [PostController::class, 'show']);
若用户传 /posts/123,Laravel 自动查出 ID=123 的 Post 实例并注入。但没验证:这个 post 是不是属于当前用户?是不是已发布?有没有查看权限?
修复做法:
- 在控制器方法中立即调用
$post->user_id === auth()->id()或更规范地使用策略(Policy)校验 - 改用隐式绑定 + 作用域约束,在路由定义时就过滤掉非授权数据:
Route::get('/posts/{post}', [PostController::class, 'show'])<br> ->scopeBindings();
并在 Post 模型中定义resolveRouteBinding方法,加入租户 ID、状态、软删除等条件
禁用全局隐式绑定,改用显式绑定 + 白名单
Laravel 默认开启隐式绑定(Route::model('post', Post::class)),容易被绕过或误用。12.x 推荐主动关闭,转为显式控制。
操作步骤:
- 在
App\Providers\RouteServiceProvider的boot()中注释或移除:Route::model('post', Post::class); - 改为手动绑定,限定字段和范围:
Route::bind('post', function ($value) {<br> return Post::where('id', $value)<br> ->where('status', 'published')<br> ->where('user_id', auth()->id())<br> ->firstOrFail();<br>});
避免在绑定中泄露敏感字段或触发危险逻辑
有些开发者在 resolveRouteBinding 里执行日志记录、计数更新、甚至调用第三方 API,这可能被批量探测利用(如爬取所有 ID 触发埋点)。
安全边界建议:
-
resolveRouteBinding只做查询和权限判断,不做写操作、不调用外部服务 - 禁止在绑定逻辑中使用用户可控参数拼接 SQL 或调用
eval/unserialize等高危函数 - 对 URL 中的 ID 做格式校验(如必须为数字、长度限制、加签验证),防枚举和伪造
配合中间件做统一上下文拦截
把权限判断从每个控制器抽出来,用中间件兜底,避免遗漏。
示例中间件(EnsurePostBelongsToUser):
- 在构造函数或 handle 中检查请求参数
post是否存在且已绑定 - 验证
$request->route('post')->user_id === auth()->id() - 不通过则直接
abort(403),不进控制器 - 注册到对应路由组,比如
middleware(['auth', 'ensure-post-owned'])


















