这是 Beta 探索课程,内容结构、实验步骤和示例可能会继续调整。
上传前的基础校验
校验不能只在前端
前端的校验只是体验优化(提示用户选错文件),真正可信的校验必须在服务端重新做一遍。任何攻击者都可以绕过前端直接调接口。
上传接口的基础校验有三道:
1. 大小限制
- 单文件大小上限(如 50MB),超过的直接拒绝。
- 同时限每日总量和并发上传数,防止滥用和拖垮服务。
超过限制的文件,不是「报错就行」,而是要有明确反馈:提示用户走分片方案,或说明限制原因。
2. 类型校验:不能只信扩展名
扩展名是用户可控的,evil.jpg 完全可能是脚本。判断类型要结合三层信息:
| 信息来源 | 可信度 | 说明 |
|---|---|---|
| 扩展名 | 低 | 用户可控,可伪造 |
| Content-Type | 中 | 客户端声明,可伪造 |
| 文件头魔数 | 高 | 读取文件真实头部字节判断 |
正确的姿势:以文件头魔数为主,扩展名与 Content-Type 辅助对照。三者不一致的,按风险处理。
3. 文件名安全
- 不能直接用于磁盘路径——否则
../../etc/passwd这类文件名会造成路径穿越。 - 服务端自己生成存储文件名(随机 ID),原始文件名只保留在元数据表里用于展示。
- 下载时用
Content-Disposition把原始文件名返回给用户,而不是让用户拼接路径。
一张图看校验流程
上传前基础校验
收到上传请求
1 · 判断
校验用户权限与配额
是否可上传、剩余额度、并发限制2 · 判断
校验文件大小
单文件上限、每日总量3 · 判断
校验文件类型
扩展名 + Content-Type + 文件头魔数4 · 动作
处理文件名
服务端生成存储名,防路径穿越5 · 结果
写入存储并保存元数据
文件内容 + 元数据记录基础防线通过,文件进入系统
校验之后
基础校验拦的是「明显不合法的请求」。真正危险的文件(病毒、违规图片、伪装文件)需要完整内容才能判断——那是第 7 章「安全审计」的异步扫描环节。
下一节看这一版的真实上限,以及为什么它是「为演进留边界」的一版。
发现内容有问题?
告诉我们哪里需要改进。
