文件上传的安全检查点清单
发布时间:2026-09-27 14:10       
更新时间:2026-09-28 05:53
文件上传是 Web 应用里出事频率最高的入口之一,攻击者最爱在图片和附件里夹带可执行脚本。这类风险靠清单管理最有效,上传功能上线前逐项打勾,比事后补救省事得多。
一、类型校验别信后缀
真实类型要看文件头,不看文件名:jpg 的文件头是 FF D8,PDF 开头是 %PDF,用 file 命令或服务端读前几个字节判断。后缀和 MIME 类型都由客户端提交,改起来毫无成本,不能作为依据。校验一律用白名单:业务只收 jpg、png、pdf,就只放这三种进白名单。黑名单永远追不完变体,白名单一圈就围住了。展示类用途还能再压一道:图片转码压缩后再落盘,转码过程天然洗掉夹带数据,输出的是干净图像,原图不必留存。
二、目录隔离不给执行权
上传目录单独划出来,与代码目录物理分开,Web 服务对它只做静态读取、禁止解析脚本。Nginx 里加一段拦截:
location ~* ^/uploads/.*\.(php|jsp|asp)$ { deny all; }
有条件的把文件挪到对象存储或独立域名下,与应用主域彻底隔离,即使有文件漏网,也找不到执行的入口。上传目录单独分区或独立挂盘更稳,就算被塞满文件,也拖不垮系统盘。
三、重命名、限权、再扫描
文件入库一律重命名为随机串,原始文件名存进数据库字段,防路径拼接和同名覆盖;目录权限 755、文件 644,写权限只留给运行账号;落盘前过一遍病毒扫描,Linux 下 clamscan 一条命令就能接入流程。接口本身再加两道限制:单文件大小上限按业务写实数,比如五兆,别留框架默认值;同一来源加频率限制,防批量投递。日志里记下上传者账号、来源地址和文件哈希,出事时能快速定位是谁传的、传了什么。
四、上传后的访问也看一眼
文件以独立地址对外提供时,按类型加白名单输出内容头,附件下载走固定接口并校验归属,防止上传地址被当跳板。
上传安全没有单点银弹,靠白名单、隔离、限权三层叠加。把这份清单贴进发布流程,每次涉及上传的改动都过一遍,就够了。