关键是在解析完请求头、未收body时拦截超大post,需分级配置client_max_body_size、调低client_body_buffer_size至2k–8k、设置client_body_timeout 10s防慢速攻击,并确保临时路径权限闭环。

要严格限制上传体积、防范恶意大文件导致缓冲区饱和,关键不是“放得更大”,而是“拦得更早、控得更细”。client_max_body_size 是第一道硬闸门,但必须配合缓冲策略、超时控制和作用域隔离,才能真正阻断攻击链。
分级设限:按路径精准控制准入门槛
避免全局放宽(如在 http 块设 0 或 1G),否则所有 POST 接口都暴露风险。应按业务类型分层配置:
- 普通 API、登录、表单提交等非上传接口:保持默认 1m 或显式设为 5m,彻底拒绝大 body 进入
- 明确的上传路径(如
/api/upload、/files/ingest):单独设置合理上限,例如 200m —— 足够业务使用,又远低于系统内存承受极限 - 完全禁用检查(
client_max_body_size 0)仅限内网调试,生产环境禁止
压低缓冲:用小 buffer 防内存耗尽
client_body_buffer_size 决定多少数据能驻留内存。攻击者常发送略超 buffer 的请求,诱使 Nginx 频繁刷盘或因磁盘失败崩溃。防御做法是:
- 对非上传类 location,设为 2k–8k(如
client_body_buffer_size 4k;) - 确保该值 ≤ 对应 location 中的 client_max_body_size,否则请求未进缓冲就被 413 拦截,失去缓冲控制意义
- 禁用
client_body_in_file_only on类激进配置,它会强制落盘,反而放大磁盘 I/O 攻击面
超时熔断:堵住慢速上传漏洞
攻击者可每秒只发几字节,长期霸占 worker 连接和缓冲资源。必须启用双超时:
- client_body_timeout 10s:从收到请求头后开始计时,body 中断或过慢即断连
- client_header_timeout 10s:防止慢速发 header 耗尽连接槽
- 两项均需与
client_max_body_size写在同一 location 块,确保策略同域生效
配套加固:临时路径与权限闭环
即使拦截严格,也要防兜底失败:
-
client_body_temp_path 必须指向独立分区(如
/var/tmp/nginx-body),并限制配额(如用tmpfs挂载,设size=512m) - Nginx 运行用户(如
www-data)对该路径必须仅有读写权限,不可执行、不可遍历上级目录 - 禁用
client_body_temp_path /tmp这类共享路径,避免与其他服务冲突或被提权利用











