laravel 10.x 图片上传漏洞防护需在接收、存储、交付三环节叠加防御:用 fileinfo 校验二进制头,强制图像重渲染剥离元数据,禁用危险扩展名,存储至 storage/app/public 并配置 web 服务器禁止执行脚本,敏感图片通过控制器鉴权响应。

修复 Laravel 10.x 图片上传木马漏洞,核心不是“防图片”,而是防“伪装成图片的恶意脚本”。Laravel 本身不校验文件内容,仅靠扩展名或 MIME 类型极易被绕过。必须在接收、存储、交付三个环节叠加防护。
严格验证文件类型与内容
仅用 mimes:jpg,png,gif 不安全——攻击者可重命名 .php 文件为 .jpg 并修改 POST 中的 MIME 值。需双重校验:
- 用
fileinfo扩展读取二进制头(magic bytes),确认真实类型。Laravel 的mimetypes规则依赖此扩展,确保服务器已启用 - 对图像文件强制重新渲染:使用
Intervention Image加载后保存为新文件,剥离 EXIF、注释、嵌入脚本等潜在恶意元数据 - 禁用所有非必要扩展:明确拒绝
.php、.phtml、.htaccess、.js等,即使用户改名上传也立即拦截
安全存储与路径隔离
上传文件绝不能放在 public/ 目录下直连访问,也不能用原始文件名:
- 始终使用
$request->file('image')->store('uploads', 'public')或storeAs(),由 Laravel 自动生成唯一哈希名,避免路径遍历和覆盖 - 将文件存入
storage/app/public(通过php artisan storage:link映射为/storage/xxx),而非public/uploads - Web 服务器(Nginx/Apache)必须配置上传目录禁止执行脚本,例如 Nginx 中添加:
location ~* ^/storage/.*\.(php|pl|py|jsp|sh|bash)$ { deny all; }
受控访问与动态响应
公开 URL 直接暴露文件路径等于放弃鉴权。敏感或用户专属图片应走控制器:
- 数据库只存哈希路径,不存原始名;前端请求图片时传 token 或 ID,后端查权限再返回
- 用
response()->file()或Storage::response()输出,而非直接链接/storage/xxx.jpg - 对私有图片,使用
local磁盘存到storage/app,完全不建软链,彻底隔绝 Web 访问
补充加固点
这些细节常被忽略,但直接影响防线强度:
- PHP 配置中设置
upload_max_filesize和post_max_size合理上限,防止 DOS 攻击 - 上传前检查
$file->isValid(),过滤临时文件丢失、超限等底层错误 - 日志记录上传行为(文件名、大小、IP、用户ID),便于事后审计
- 生产环境务必关闭
APP_DEBUG=true,防止错误页面泄露路径或配置











