安全
上传限制
限制文件大小、类型、次数和总容量,避免上传入口被滥用
为什么要限制上传
上传入口看起来只是“让用户传一个文件”,但它背后会消耗带宽、服务器内存、对象存储和后续处理资源。没有限制时,别人可能把你的网站当成免费网盘,反复上传大文件或大量无意义文件。
最直观的后果是:存储账单变高、网站变慢、后台需要清理垃圾文件,严重时还可能出现违规内容。
01MVP 的通用上传接口默认限制:
- bucket 只能使用配置里的允许值。
- path 不能包含路径穿越、双斜杠、绝对路径和敏感词。
- 文件类型必须在允许列表内,并且要和文件扩展名匹配。
- 获取上传链接时要上报文件大小,超过限制不签发。
- 直接上传会在读取文件前后都检查大小。
- 签名上传和直接上传都有独立用户级频率限制。
环境变量
# 单个通用上传文件大小,默认 10MB
UPLOAD_MAX_FILE_SIZE_MB=10
# 每个用户 15 分钟最多获取多少个签名上传链接
UPLOAD_SIGNED_URL_RATE_LIMIT_MAX_REQUESTS=60
# 每个用户 15 分钟最多走多少次直接上传 fallback
UPLOAD_DIRECT_RATE_LIMIT_MAX_REQUESTS=20/drop 这类产品级上传有自己的配额和文件大小配置,不直接复用通用上传限制。通用上传限制适合头像、附件、资料文件等普通入口。
两种上传方式
| 方式 | 优点 | 风险 | 处理 |
|---|---|---|---|
| 签名上传 | 文件不经过应用服务器,服务器压力低 | 上传结果还要依赖对象存储侧的权限和后续校验 | 签发前检查大小,存储侧配置权限、生命周期和容量监控 |
| 直接上传 | 兼容签名上传失败的 fallback | 文件会进入应用进程,容易占用内存 | 读取文件前后都检查大小 |
签名上传只能控制“要不要给这个用户上传入口”,不能单独解决所有存储风险。对大文件、付费内容或公开投稿这类场景,应增加对象存储策略、上传完成后的后台校验和人工审核。
推荐策略
| 场景 | 建议 |
|---|---|
| 头像、图片附件 | 限制到 2-5MB,只允许图片 MIME |
| PDF、文档附件 | 限制到 10MB,明确允许扩展名 |
| 视频或大文件 | 不走通用上传接口,单独设计分片、异步扫描和配额 |
| 匿名上传 | 尽量不要开放;必须开放时加 CAPTCHA、限流和更小大小限制 |
| 付费用户上传 | 按用户套餐增加总存储配额,而不是只放大单文件大小 |
常见后果
| 没做限制 | 后果 |
|---|---|
| 不限制文件大小 | 存储和带宽费用上涨,服务器处理大文件变慢 |
| 不限制上传次数 | 同一个账号可以反复制造垃圾文件 |
| 不限制文件类型 | 用户可能上传可执行文件、伪装文件或不适合公开展示的内容 |
| 不限制总容量 | 免费用户也可能长期占用大量存储 |
| 不审核公开上传内容 | 违规内容可能出现在你的站点或存储桶里 |