文件上传是 Web 应用的标配功能,也是攻防经验里最丰富的突破口之一。防护体系可以概括为三道防线,每道都有明确动作。
## 第一道:类型白名单
上传校验的核心原则是白名单而非黑名单。扩展名黑名单永远在追新:改大小写、加空格、用少见扩展名的绕过姿势层出不穷。白名单反其道:只允许业务真正需要的类型,图片上传就只收几种主流图片格式,其余一律拒绝。校验要贯穿多层:前端校验只算体验优化,服务端必须独立校验扩展名,再配合文件头校验内容真实性,改名伪装的文件在这一层现形。
## 第二道:重命名与路径控制
用户原始文件名不可信任:文件名里可能藏着路径片段、特殊字符与双重扩展名。服务端收到文件后,用随机字符串重命名,扩展名由服务端从白名单判定后自行拼接,用户输入彻底退出命名环节。存储路径同样要控制:路径由服务端逻辑生成,任何用户输入不参与路径拼接,防止把文件写到预期目录之外。
## 第三道:隔离存储与执行剥离
上传目录的隔离有两个层面。位置隔离:上传目录不放 Web 根目录下的可执行路径,静态资源域与主站分离是更彻底的做法,即使上传物有问题,也不在主站上下文里生效。执行剥离:Web 服务器对上传目录关闭脚本解析,这个目录里的任何文件只作为静态内容返回,攻击者上传的脚本拿到也只是一段文本。目录权限收窄到只读返回,服务进程对它没有执行权限。
三道防线的逻辑是层层设防:白名单挡住绝大多数尝试,重命名消解文件名里的私货,隔离存储保证即使前两道失守,攻击也无法升级为代码执行。顺云用户在部署应用时,把上传目录的解析关闭与路径隔离一并配置,控制台的防火墙规则可以再限制上传接口的访问来源,多层防护的组合成本不高,收益直接。