安全审计

文件上传系统天然是攻击入口。用户可以上传图片,也可以上传脚本、压缩包、伪装文件、超大文件或带敏感内容的材料。如果系统只关注“能不能传上来”,很快就会遇到安全和合规问题。

安全审计不是最后加一个开关,而是一条贯穿上传、存储、访问和删除的治理链路。

上传前校验

上传前的目标是尽早拦截明显不合法的请求:

  • 校验用户是否有上传权限和剩余额度。
  • 限制文件大小、单日上传量和并发上传数。
  • 检查扩展名、Content-Type 和文件头魔数是否一致。
  • 对高风险类型直接拒绝,例如可执行文件、脚本文件。

这些校验不能只放在前端。前端限制只是体验优化,服务端必须重新校验。

上传后扫描

很多风险只有拿到完整文件后才能判断,例如病毒、违规图片、敏感文档。上传完成后,文件不应该立刻变成可访问状态,而是进入扫描流程:

uploaded -> scanning -> available
                   -> rejected
                   -> manual_review

扫描任务适合异步处理。业务服务写入状态后,把任务投递到队列,由扫描服务完成病毒检测、内容审核、格式解析或缩略图生成。扫描期间,下载接口应该返回“处理中”或只允许管理员访问。

权限控制

文件权限不能只靠“URL 足够复杂”。系统需要明确访问模型:

  • 公开文件:任何人可访问,适合公开图片和下载资源。
  • 私有文件:只有拥有者、协作者或特定角色可访问。
  • 临时文件:只在短时间内可访问,到期自动删除。
  • 隔离文件:命中风险后禁止普通访问,只允许审计人员处理。

权限校验应该发生在业务服务生成下载 URL 之前。即使文件最终由 CDN 或对象存储提供,也要由业务服务控制签名生成。

审计日志

文件系统要记录关键操作:

操作需要记录的信息
上传用户、IP、文件 hash、大小、类型、结果
下载用户、文件、时间、来源、签名过期时间
删除操作人、原因、是否物理删除
审核审核结果、规则命中、人工处理记录

审计日志不要和业务主流程强耦合。主流程写入轻量事件,日志服务异步消费并落库,避免审计系统故障拖垮上传。

风险处置

发现风险文件后,系统要能快速处置:

  • 立即把文件状态改为 blocked
  • 刷新或禁用 CDN 缓存。
  • 取消未过期的签名 URL。
  • 通知上传者或管理员。
  • 保留证据文件和审计记录。

安全审计补齐后,文件系统才从“能传能下”变成“可管理、可追责、可上线”的基础平台。