上传前的基础校验

校验不能只在前端

前端的校验只是体验优化(提示用户选错文件),真正可信的校验必须在服务端重新做一遍。任何攻击者都可以绕过前端直接调接口。

上传接口的基础校验有三道:

1. 大小限制

  • 单文件大小上限(如 50MB),超过的直接拒绝。
  • 同时限每日总量和并发上传数,防止滥用和拖垮服务。

超过限制的文件,不是「报错就行」,而是要有明确反馈:提示用户走分片方案,或说明限制原因。

2. 类型校验:不能只信扩展名

扩展名是用户可控的,evil.jpg 完全可能是脚本。判断类型要结合三层信息:

信息来源可信度说明
扩展名低用户可控,可伪造
Content-Type中客户端声明,可伪造
文件头魔数高读取文件真实头部字节判断

正确的姿势:以文件头魔数为主,扩展名与 Content-Type 辅助对照。三者不一致的,按风险处理。

3. 文件名安全

  • 不能直接用于磁盘路径——否则 ../../etc/passwd 这类文件名会造成路径穿越。
  • 服务端自己生成存储文件名(随机 ID),原始文件名只保留在元数据表里用于展示。
  • 下载时用 Content-Disposition 把原始文件名返回给用户,而不是让用户拼接路径。

一张图看校验流程

上传前基础校验

收到上传请求
1 · 判断

校验用户权限与配额

是否可上传、剩余额度、并发限制
2 · 判断

校验文件大小

单文件上限、每日总量
3 · 判断

校验文件类型

扩展名 + Content-Type + 文件头魔数
4 · 动作

处理文件名

服务端生成存储名,防路径穿越
5 · 结果

写入存储并保存元数据

文件内容 + 元数据记录
基础防线通过,文件进入系统

校验之后

基础校验拦的是「明显不合法的请求」。真正危险的文件(病毒、违规图片、伪装文件)需要完整内容才能判断——那是第 7 章「安全审计」的异步扫描环节。

下一节看这一版的真实上限,以及为什么它是「为演进留边界」的一版。

发现内容有问题?

告诉我们哪里需要改进。