VWCG-1238 CODE-02 图片上传白名单及上传目录禁执行
/p/common/upload · 电子菜牌图片 · 本地/OSS双路径
核心边界:不能给通用File::upload()直接加图片白名单。新增uploadImageFile(),只由/p/common/upload调用;校验必须发生在OSS/本地分支之前。
两层防护
应用层
扩展名、finfo MIME、getimagesize类型/尺寸、大小和危险双扩展名全部匹配后才允许保存。
Web层
Nginx对整个/static/upload/禁止PHP、PHTML、PHAR等脚本解析,覆盖sourceimg等子目录。
白名单
| 允许 | 拒绝 |
|---|---|
| JPG/JPEG、PNG(与当前电子菜牌既有格式一致) | PHP/PHTML/PHAR、HTML/JS、SVG、GIF/WebP、无扩展名、危险双扩展、MIME或图片类型不匹配 |
已采用大小上限10MB、宽高不超过10000×10000。
存储链路
/p/common/upload
→ uploadImageFile()
→ validateImageUpload()
→ 通过后调用原uploadFile()
→ 本地或OSS
→ 写ydy_upload_file
任一校验失败 → 无文件、无OSS对象、无数据库记录
不受影响
- 人员、菜品、食材、充值Excel导入。
- 训练经历和供应商等普通附件。
- 移动端/小程序其他图片接口。
- 通用File::upload()和File::uploadFile()保持兼容。
实施切片
- 图片校验器与单元测试。
- PC接口和电子菜牌前端。
- 本地/OSS双路径回归。
- Nginx禁执行、历史文件扫描和证据。
实施状态
| 业务代码与安全测试 | 已完成,25个测试、104个断言通过 |
| PC前端生产构建 | 已完成 |
| 仓库Nginx模板 | 已更新,Docker环境语法检查通过 |
| 新吴区生产路径及前缀 | 待部署时回读确认 |
| 历史危险文件扫描与复测 | 待生产发布环节执行 |
代码层已落地;线上漏洞关闭仍以真实vhost禁执行、历史文件清理和复测通过为准。