文件上传的风险核心是用户可控的文件被当作可执行内容处理:上传 WebShell(.jsp/.php)被解析执行、上传 HTML/SVG 造成存储型 XSS、超大文件或压缩炸弹耗尽资源、路径穿越(../../)覆盖系统文件、恶意文件成为分发跳板。

安全实现要点:1)类型校验不能只看后缀和 Content-Type(客户端可伪造),要读取文件头 magic number 校验真实类型,图片建议服务端重新编码处理(顺便剥离 EXIF 与多文件 polyglot);2)扩展名用白名单而非黑名单(黑名单容易被 .phtml、大小写、.php5 绕过);3)存储时重命名为随机文件名,拒绝用户控制路径,过滤 ../ 与空字节;4)上传到独立域名或对象存储(如 OSS/S3),与主站 cookie 域隔离,且该域不配置脚本执行权限——存储目录关闭执行权是兜底;5)限制大小、数量与解压比;6)下载时强制 Content-Disposition: attachment 和正确的 Content-Type,防浏览器嗅探。

响应头: X-Content-Type-Options: nosniff

追问方向:SVG 的 XSS 风险、压缩炸弹防御、条件竞争(先上传再查杀的时间窗)。