防范大文件恶意上传攻击的关键是精准控制上传路径的容量边界、缓冲行为与超时机制,并切断非预期流量入口;Nginx需在专用location中配置client_max_body_size等参数,配合Node.js层二次校验与熔断。

防范大文件恶意上传攻击,关键不是“堵死上传”,而是精准控制上传路径的容量边界、缓冲行为与超时机制,同时切断非预期流量入口。Nginx 本身不处理文件逻辑,但它作为第一道网关,能高效拦截非法请求体,避免后端被无效流量拖垮。
只在上传专用 location 中设 client_max_body_size
这是最常被忽略的核心原则。413 错误由 Nginx 在请求解析初期就触发,若配置位置错误,等于没配。
- 必须写在匹配真实上传接口的 location 块内,例如:
location /api/upload {<br> client_max_body_size 200m;<br> proxy_pass http://node_backend;<br>} - 如果还有分片上传、头像裁剪、附件预检等路径(如
/chunk、/avatar、/verify),每个都要单独配置,不共用、不继承 - 禁止在
http或server块全局设大值(如client_max_body_size 1g),否则登录页、管理后台等所有接口都暴露在大包攻击下
配套参数同步收紧,防绕过和资源耗尽
仅调大 client_max_body_size 不够——攻击者可发大量小包慢速上传、或故意填满缓冲区再卡住连接。
-
client_body_buffer_size:设为
512k~1m。太小(默认 8k)导致频繁刷盘,易被 IO 拖垮;太大则内存占用失控 -
client_header_timeout 和 client_body_timeout:建议设为
30s。防止慢速 HTTP 攻击(如 Slowloris)长时间占住连接 -
client_max_body_size 需配合 proxy_read_timeout(建议
600,即 10 分钟)。否则 Nginx 在接收完文件但还没转发给 Node.js 时超时,会返回 504 -
client_body_temp_path 必须指向独立磁盘分区(如
/data/nginx/tmp),并确认 Nginx 进程用户(如www-data)有读写权限,且该路径有足够空间和 inodes
从源头阻断非法上传入口
很多“大文件攻击”其实来自非业务域名恶意指向或未授权路径扫描,而非真实用户。
- 在 server 块中显式拒绝 Host 头为空或未知域名的请求:
if ($host !~ ^(your-api\.com|api\.yourapp\.io)$) { return 444; }
(444是 Nginx 特有关闭连接码,不发响应,更难探测) - 对非上传路径(如
/login、/admin、/health)统一限制极小 body:location / { client_max_body_size 1k; } - 禁用未使用的 HTTP 方法:
if ($request_method !~ ^(GET|HEAD|POST|OPTIONS)$ ) { return 405; }
Node.js 层做二次校验与熔断
Nginx 放行后,Node.js 必须严格对齐限制,并主动识别异常行为。
- Multer 初始化时明确设
limits: { fileSize: 200 * 1024 * 1024 },且fileFilter检查file.mimetype是否在白名单内(如只允许image/*、application/pdf) - 记录上传 IP、User-Agent、文件名、大小,对单 IP 短时高频大文件请求(如 5 分钟内 3 次 >100MB)自动限流或封禁
- 使用
express-rate-limit或redis-rate-limiter对/api/upload路径做请求频次+体积双维度限制


















