最有效方式是在解析完请求头、未收body时拦截超大post。需分级配置client_max_body_size,调低client_body_buffer_size至2k–8k,设置client_body_timeout 10s防慢速攻击,并结合限速、方法限制等纵深防御。

直接在请求体读取前拦截超大 POST,是保护 Nginx 缓冲区最有效的方式。核心不是等数据进来再处理,而是在解析完请求头、还没开始收 body 时就做尺寸判断并拒绝。
精准设置 client_max_body_size
这是第一道防线,必须按业务场景分级配置:
- 普通表单、API 接口:保持默认 1m 或设为 5m,足够覆盖 JSON、小图片等常见载荷
- 文件上传类接口(如文档、分片上传):在对应
location块中单独设高值,例如client_max_body_size 200m; - 完全禁用检查(
client_max_body_size 0)不可取,等于主动放弃缓冲区入口防护 - 该指令支持嵌套生效,越靠近具体路径越精准,避免全局宽松导致风险扩散
合理控制内存缓冲与临时文件行为
仅限 size 检查不够,还需管理 body 如何暂存:
- 调低 client_body_buffer_size(建议 2k–8k),防止小请求意外占满 worker 内存
- 若设为 1k,多数表单仍走内存;超限时写入临时磁盘,避免内存溢出
- 确保
client_body_temp_path指向有足够空间和写权限的目录,否则大请求会直接失败 - 内网可信环境可考虑
client_body_in_single_buffer on,但需配合 buffer_size 设得足够大且严格限制来源 IP
堵住慢速攻击绕过漏洞
攻击者可能用极慢速分段发送超大 body,绕过 size 检查却长期占用连接资源:
- 强制设置 client_body_timeout 10s,从收到 header 后开始计时,body 中断即断连
- 同步收紧 client_header_timeout 10s,防慢速发头耗尽连接槽
- 反向代理场景下,显式关闭
proxy_buffering off;和proxy_request_buffering off;(Nginx 1.16+),避免代理层二次缓存放大压力
叠加基础安全策略形成纵深防御
缓冲区防护不能孤立存在,需嵌入整体安全链:
- 限制请求方法:
if ($request_method !~ ^(GET|HEAD|POST)$) { return 405; },阻止 PUT/DELETE 等绕过常规 POST 防护的载荷注入 - 启用速率限制:
limit_req zone=post_limit burst=5 nodelay;,对/api/类路径每秒限 5 请求,防刷同时减轻瞬时缓冲压力 - 屏蔽已知恶意 UA:
if ($http_user_agent ~* "(sqlmap|nikto|curl|wget)") { return 444; },直接断连不响应











