Laravel应用上线前须堵住路径遍历与文件上传两大漏洞:路径遍历需禁用参数直传、白名单校验、realpath根目录比对;文件上传需重命名隔离存储、扩展名/MIME/二进制签名三重校验、图片元数据剥离,并配置私有磁盘权限与HTTPS路径。

防止攻击者通过构造特殊路径访问服务器敏感文件,或上传恶意脚本执行远程代码,是Laravel应用上线前必须堵住的两个关键漏洞入口。
阻止路径遍历攻击
路径遍历依赖于用户可控的文件路径参数(如/download?file=../../.env),必须从参数解析、路径解析、文件读取三处切断链条。
第一步:禁用原始参数直传。不要在控制器中直接拼接用户输入的路径字符串,例如避免使用file_get_contents($request->input('file'))。
第二步:强制白名单校验。若业务确需动态读取文件,先定义允许的子目录范围:【$allowedPaths = ['reports', 'invoices', 'logs'];】,再用str_starts_with()验证请求路径是否严格落在其中。
第三步:调用realpath()并比对根目录。获取真实路径后,检查其是否仍位于预期根目录内:$realPath = realpath(storage_path('app/' . $safeFileName)); if (strpos($realPath, storage_path('app')) !== 0) { abort(403); }。这一步能彻底封死../绕过。
安全处理用户上传的文件
文件上传是XSS、RCE、WebShell植入的高危通道,不能只靠前端限制或简单后缀检查。
方法一:强制重命名+隔离存储位置
接收文件后立即丢弃原始文件名,生成随机哈希名:$safeName = Str::uuid() . '.' . $file->getClientOriginalExtension();。将文件存入private磁盘而非public,确保无法被直接URL访问。
方法二:双重类型校验——扩展名 + MIME + 二进制签名
仅验证mimes:jpg,png不够,攻击者可伪造扩展名。必须配合$file->getMimeType()比对,并用finfo_file()读取文件头验证真实类型。例如PNG文件开头必须是\x89PNG,否则abort(415)拒绝。
方法三:剥离图片元数据与可执行代码
对上传的图片,用Intervention Image重新编码:Image::make($file)->encode('jpg', 85)。这会清除EXIF、ICC配置文件及可能嵌入的PHP代码,同时压缩体积。重新编码后的二进制流才是最终落盘内容。
配置上传目录权限与磁盘策略
第一步:修改config/filesystems.php,新增专用私有磁盘:
'private_uploads' => [ 'driver' => 'local', 'root' => storage_path('app/private_uploads'), 'visibility' => 'private', ],
第二步:在服务器上执行chmod 755 storage/app/private_uploads,禁止该目录下任何文件被解释执行。Linux系统中,即使上传了.php文件,无执行权限也无法被Apache/Nginx解析运行。
第三步:在.env中确认APP_URL为HTTPS地址,所有文件路径生成时自动走secure_url(),杜绝HTTP混合内容与中间人篡改路径。


















