这是 Beta 探索课程,内容结构、实验步骤和示例可能会继续调整。
安全审计
文件上传系统天然是攻击入口。用户可以上传图片,也可以上传脚本、压缩包、伪装文件、超大文件或带敏感内容的材料。如果系统只关注“能不能传上来”,很快就会遇到安全和合规问题。
安全审计不是最后加一个开关,而是一条贯穿上传、存储、访问和删除的治理链路。
上传前校验
上传前的目标是尽早拦截明显不合法的请求:
- 校验用户是否有上传权限和剩余额度。
- 限制文件大小、单日上传量和并发上传数。
- 检查扩展名、
Content-Type和文件头魔数是否一致。 - 对高风险类型直接拒绝,例如可执行文件、脚本文件。
这些校验不能只放在前端。前端限制只是体验优化,服务端必须重新校验。
上传后扫描
很多风险只有拿到完整文件后才能判断,例如病毒、违规图片、敏感文档。上传完成后,文件不应该立刻变成可访问状态,而是进入扫描流程:
uploaded -> scanning -> available
-> rejected
-> manual_review
扫描任务适合异步处理。业务服务写入状态后,把任务投递到队列,由扫描服务完成病毒检测、内容审核、格式解析或缩略图生成。扫描期间,下载接口应该返回“处理中”或只允许管理员访问。
权限控制
文件权限不能只靠“URL 足够复杂”。系统需要明确访问模型:
- 公开文件:任何人可访问,适合公开图片和下载资源。
- 私有文件:只有拥有者、协作者或特定角色可访问。
- 临时文件:只在短时间内可访问,到期自动删除。
- 隔离文件:命中风险后禁止普通访问,只允许审计人员处理。
权限校验应该发生在业务服务生成下载 URL 之前。即使文件最终由 CDN 或对象存储提供,也要由业务服务控制签名生成。
审计日志
文件系统要记录关键操作:
| 操作 | 需要记录的信息 |
|---|---|
| 上传 | 用户、IP、文件 hash、大小、类型、结果 |
| 下载 | 用户、文件、时间、来源、签名过期时间 |
| 删除 | 操作人、原因、是否物理删除 |
| 审核 | 审核结果、规则命中、人工处理记录 |
审计日志不要和业务主流程强耦合。主流程写入轻量事件,日志服务异步消费并落库,避免审计系统故障拖垮上传。
风险处置
发现风险文件后,系统要能快速处置:
- 立即把文件状态改为
blocked。 - 刷新或禁用 CDN 缓存。
- 取消未过期的签名 URL。
- 通知上传者或管理员。
- 保留证据文件和审计记录。
安全审计补齐后,文件系统才从“能传能下”变成“可管理、可追责、可上线”的基础平台。
