laravel文件管理系统需三重加固防越权:路由层强制auth中间件,策略层按用户/团队隔离文件并校验下载权限,存储层禁用危险mime类型及执行权限。

当多个用户共用一套 Laravel 文件管理系统时,非授权用户可能直接访问他人上传的图片、文档或下载链接,导致隐私泄露甚至数据篡改。必须在路由层、策略层、存储层三重加固,才能真正阻断越权路径。
启用文件管理路由的强制认证守卫
打开 routes/web.php,找到 laravel-filemanager 的路由注册块,确认已包裹在带 auth 中间件的组内:
Route::group(['prefix' => 'laravel-filemanager', 'middleware' => ['web', 'auth']], function () { \UniSharp\LaravelFilemanager\Lfm::routes(); });
【未加 auth 中间件会导致任何访客都能打开 /laravel-filemanager 页面,直接浏览、上传、删除服务器全部文件】
若项目启用了多守卫(如 api + web),需显式指定守卫名:'middleware' => ['web', 'auth:web']。
配置用户级文件隔离模式
编辑 config/lfm.php,定位到 user_field 和 shared_folder 两项:
方法一:按用户 ID 隔离(推荐)
将 'user_field' => 'id',同时设置 'shared_folder' => false。
这会让每个用户登录后只能看到自己目录下的 userfiles/123/(123 是其 user id),其他用户目录完全不可见、不可拼接路径访问。
方法二:按用户名隔离
设 'user_field' => 'name',但需确保用户名无特殊字符且全局唯一;若用户名含空格或中文,会导致路径 404 或拒绝访问。
方法三:关闭共享但保留团队可见性
设 'shared_folder' => true 且 'user_field' => 'team_id',适用于同一团队成员需协作管理媒体库的场景。
定义文件下载策略防止 ID 猜解
第一步:生成策略类
php artisan make:policy FilePolicy --model=File
第二步:在 app/Policies/FilePolicy.php 中编写核心逻辑:
public function download(User $user, File $file)
{
// 拒绝通过 URL 直接猜测 ID 下载他人文件
$isOwner = $user->id === $file->user_id;
$inSameTeam = $user->team_id && $user->team_id === $file->team_id;
$hasPurchased = $file->purchases()->where('user_id', $user->id)->exists();
return $isOwner || $inSameTeam || $hasPurchased;
}
第三步:在控制器中强制调用该策略
return response()->download($file->path)->can('download', $file);
第四步:注册策略到 AuthServiceProvider 的 registerPolicies() 方法中:
Gate::resource('file', FilePolicy::class);
禁用危险文件类型与执行权限
打开 config/lfm.php,修改以下两项:
设置允许上传的扩展名白名单:
'valid_mime' => ['image/jpeg', 'image/png', 'application/pdf', 'text/plain'],
禁用所有可执行脚本类型:
'invalid_mime' => ['application/x-php', 'application/x-sh', 'text/x-shellscript', 'application/x-httpd-php'],
【务必删除 'application/octet-stream' 这个通配类型,否则攻击者可绕过 mime 检查上传 .php 文件】
在 Linux 服务器上,运行命令禁止 public/uploads 目录下所有文件的执行权限:
chmod -R -x public/uploads











