如何在Laravel中防止URL地址篡改,限制非法ID访问
在Laravel中限制Post ID只能访问指定值的实现方案
嘿,这个需求其实不难搞定,我给你整理了几个靠谱的实现方式,你可以根据自己的场景灵活选择:
方案1:控制器方法内直接校验
这是最直接的方式,适合只需要在单个控制器方法里做限制的场景。在你的PostController的show方法里,先判断传入的ID是否为指定的11,不符合的话直接跳转或者返回禁止访问:
public function show($id) { // 校验ID是否为允许的11 if ((int)$id !== 11) { // 方式1:跳转到默认页面(比如首页) return redirect()->route('home'); // 方式2:直接返回403禁止访问页面 // abort(403, '你无权访问该内容'); } // 正常获取并展示ID为11的文章 $post = \App\Models\Post::findOrFail(11); return view('posts.show', compact('post')); }
方案2:路由层面做限制
如果你的需求是只有/posts/11这个URL能正常访问,其他/posts/{id}都要被拦截,那可以直接在路由里配置:
// 首先定义允许访问的固定路由 Route::get('/posts/11', [\App\Http\Controllers\PostController::class, 'showDefault'])->name('posts.default'); // 然后捕获所有其他/posts/{id}的请求,直接处理 Route::get('/posts/{id}', function () { // 跳转到默认页面或者返回403 return redirect()->route('posts.default'); // abort(403); });
对应的控制器方法可以简化成:
public function showDefault() { $post = \App\Models\Post::findOrFail(11); return view('posts.show', compact('post')); }
方案3:使用中间件(适合多路由复用)
如果多个路由都需要类似的ID限制,或者你想把校验逻辑抽离出来,用中间件是最好的选择:
步骤1:创建中间件
执行Artisan命令生成中间件:
php artisan make:middleware RestrictPostId
步骤2:编写中间件逻辑
打开app/Http/Middleware/RestrictPostId.php,修改handle方法:
public function handle(Request $request, Closure $next) { // 获取路由参数里的ID $postId = $request->route('id'); // 校验是否为允许的ID if ((int)$postId !== 11) { // 跳转或返回403 return redirect()->route('home'); // abort(403, '访问被禁止'); } return $next($request); }
步骤3:注册中间件
打开app/Http/Kernel.php,在$routeMiddleware数组里添加中间件:
protected $routeMiddleware = [ // 其他已有的中间件... 'restrict.post.id' => \App\Http\Middleware\RestrictPostId::class, ];
步骤4:在路由中使用中间件
给需要限制的路由加上这个中间件:
Route::get('/posts/{id}', [\App\Http\Controllers\PostController::class, 'show'])->middleware('restrict.post.id');
这样只要访问的ID不是11,就会被中间件拦截处理啦~
内容的提问来源于stack exchange,提问作者Copain
相关产品推荐
相关产品推荐

