必须为文件管理器路由配置鉴权中间件,禁止未授权访问;需注册中间件、绑定路由、细化操作权限校验,并将路由移至API组以绕过CSRF防护。

在 Laravel 项目中集成第三方文件管理器(如 elFinder、Laravel File Manager 或自研文件浏览器)时,必须阻止未授权用户访问 /files 路由或 /laravel-filemanager 资源入口,否则会导致敏感目录遍历、文件泄露甚至远程代码执行风险。
注册中间件并绑定到文件管理器路由
第一步:运行命令生成专用中间件
php artisan make:middleware FileManagerAuth
第二步:打开 app/Http/Middleware/FileManagerAuth.php,替换 handle 方法为以下逻辑:
public function handle($request, Closure $next)
{
if (!auth()->check()) {
abort(401);
}
$user = auth()->user();
if (!$user->hasRole('admin') && !$user->hasPermissionTo('access.files')) {
abort(403);
}
return $next($request);
}
第三步:在 app/Http/Kernel.php 的 $routeMiddleware 数组中注册别名:
'filemanager.auth' => \App\Http\Middleware\FileManagerAuth::class,
第四步:定位文件管理器的路由定义位置——若使用 laravel-filemanager 包,通常在 routes/web.php 中已存在类似 Route::get('/laravel-filemanager', [...]) 的注册;【必须删除原有无鉴权的路由,否则中间件不生效】
第五步:用带中间件的新路由覆盖原路由,例如:
Route::get('/laravel-filemanager', [\Unisharp\Laravelfilemanager\controllers\LfmController::class, 'show'])->middleware('filemanager.auth');
动态校验文件操作权限(读/写/删除)
文件管理器常暴露多个子端点:/lfm/upload、/lfm/delete、/lfm/cut 等。仅校验入口不够,需按动作细化控制。
方法一:为每个 HTTP 方法 + 路由路径单独配置中间件
在 routes/web.php 中显式声明:
Route::post('/laravel-filemanager/upload', [\Unisharp\Laravelfilemanager\controllers\LfmController::class, 'upload'])->middleware('filemanager.auth:upload');
Route::post('/laravel-filemanager/delete', [\Unisharp\Laravelfilemanager\controllers\LfmController::class, 'delete'])->middleware('filemanager.auth:delete');
然后修改 FileManagerAuth 的 handle 方法,支持接收动作参数:
public function handle($request, Closure $next, $action = 'view')
并在内部追加判断:if ($action === 'delete' && !$user->can('delete-files')) { abort(403); }
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
方法二:统一拦截,从请求路径提取动作
在 handle 方法中直接解析当前路由:
$path = $request->route()->uri();
if (str_contains($path, 'delete') && !$user->can('delete-files')) { abort(403); }
if (str_contains($path, 'upload') && !$user->can('upload-files')) { abort(403); }
注意:此方式依赖 URI 命名规范,若包升级后路径变更,此处会失效。
绕过 CSRF 防护但保留鉴权
Laravel 文件管理器通常通过 iframe 或 AJAX 上传,而默认 web 中间件组包含 VerifyCsrfToken,会导致 POST 请求被拒绝。
第一步:确认文件管理器所有路由都属于 API 场景——它们不维护会话状态,只响应 JSON。
第二步:将这些路由移出 routes/web.php,新建 routes/filemanager.php,并在其中定义:
Route::prefix('api/files')->group(function () {
Route::post('upload', [FileController::class, 'upload']);
Route::delete('{id}', [FileController::class, 'destroy']);
});
第三步:在 app/Providers/RouteServiceProvider.php 的 mapApiRoutes() 方法中加载该文件:
Route::middleware('api')->prefix('api')->group(base_path('routes/filemanager.php'));
第四步:确保该路由组仅应用 auth:sanctum 或 auth:api 中间件,而非 web 组——【否则 VerifyCsrfToken 会拦截所有 POST 请求】


















