安全

上传限制

限制文件大小、类型、次数和总容量,避免上传入口被滥用

为什么要限制上传

上传入口看起来只是“让用户传一个文件”,但它背后会消耗带宽、服务器内存、对象存储和后续处理资源。没有限制时,别人可能把你的网站当成免费网盘,反复上传大文件或大量无意义文件。

最直观的后果是:存储账单变高、网站变慢、后台需要清理垃圾文件,严重时还可能出现违规内容。

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、限流和更小大小限制
付费用户上传按用户套餐增加总存储配额,而不是只放大单文件大小

常见后果

没做限制后果
不限制文件大小存储和带宽费用上涨,服务器处理大文件变慢
不限制上传次数同一个账号可以反复制造垃圾文件
不限制文件类型用户可能上传可执行文件、伪装文件或不适合公开展示的内容
不限制总容量免费用户也可能长期占用大量存储
不审核公开上传内容违规内容可能出现在你的站点或存储桶里

相关链接