文件上传与存储
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @org-02qudk26/file-uploads。
技能介绍
为什么文件上传容易出事
很多实现只检查客户端传来的扩展名或 Content-Type,攻击者可以轻易伪装成「图片」上传可执行内容。用户可控的文件名若直接拼进存储路径,还可能触发路径遍历。大文件若全部经应用服务器中转,会占满内存与带宽,拖垮整站。
技能会怎么引导你
本技能以文件上传专家视角工作:默认不信任扩展名,强调用魔数(magic bytes)做真实类型判断;要求明确上传大小上限;对文件名做净化,避免 ../ 一类路径注入。在架构上,它更倾向预签名 URL——客户端直传对象存储,服务端只签发短时凭证,而不是长期代理字节流。
适用边界与注意点
| 问题 | 严重程度 | 应对方向 |
|------|----------|----------|
| 轻信客户端文件类型 | 严重 | 魔数校验 |
| 未限制上传大小 | 高 | 配置大小限制 |
| 用户可控文件名 | 严重 | 净化文件名 |
| 预签名 URL 被共享或缓存 | 中 | 控制签发与分发策略 |
预签名 URL 仍需要合理的过期时间与权限范围;它解决的是流量与职责分离,不能替代服务端对业务规则(谁可以传、传什么)的校验。
使用场景
- 设计用户头像/附件接口时,需要拒绝伪装成图片的可执行文件,并写清魔数校验步骤
- 要把大文件从「经 Flask/Node 中转」改成客户端直传 OSS/S3,需要预签名 URL 的权限与过期策略
- 多租户系统按用户 ID 分目录存文件,需净化原始文件名以防 `../` 路径遍历
- 上线前自查上传模块:是否设了 body 大小上限、是否仍只信扩展名或 Content-Type
适合人员
- 负责用户生成内容(UGC)上传的后端工程师,要在接口层落实类型与路径安全
- 维护对象存储对接的全栈开发,要把直传方案与业务鉴权拆清楚,避免预签名链接被滥用
- 安全评审或渗透测试后需改上传链路的研发,对照魔数、限流与文件名规则逐项落地
- 处理视频/备份等大体积上传的工程师,需要分片或直传策略而不是整文件堆在应用内存里