Nginx 防缓冲区溢出依赖内置缓冲指令而非自定义模块,核心是 client_header_buffer_size 与 large_client_header_buffers 匹配设限,配合 client_max_body_size、proxy_buffer 参数及超时、HTTP/2 等加固项实现分层防护。

Nginx 防止缓冲区溢出,不是靠“写一个模块”来实现,而是通过在 http、server 或 location 块中配置一组已有、经过验证的缓冲控制指令,让 Nginx 在请求解析和代理转发的各个阶段主动设限、分层拦截。它不依赖运行时内存扫描,而是从连接建立之初就拒绝异常路径。
client_header_buffer_size 和 large_client_header_buffers
这是防请求头溢出的核心组合。
Nginx 先用小缓冲(client_header_buffer_size)尝试接收请求行和头部;若不够,再启用备用池(large_client_header_buffers)。两者必须匹配,否则直接 400。
-
client_header_buffer_size 2k;
覆盖典型 JWT(1.5–2.5KB)、基础 Cookie 和追踪头,比默认 1k 更稳妥。 -
large_client_header_buffers 4 8k;
表示最多使用 4 块 8KB 缓冲,总上限 32KB;单块大小(8k)必须 ≥ 初始缓冲(2k),否则扩容逻辑失效。
⚠️ 注意:不要设
64k或1m—— 攻击者可构造单行超长头反复建连,快速耗尽 worker 内存。
client_max_body_size 和 client_body_buffer_size
针对 POST/PUT 的请求体(如文件上传、JSON 数据),需双管齐下:
-
client_max_body_size 50m;
在解析完请求头后、读取 body 前立即判断,超限返回 413,不进后端、不占缓冲。 -
client_body_buffer_size 2k;
控制内存中暂存 body 的单次缓冲大小;设得太大会放大内存风险,太小则频繁落盘(依赖client_body_temp_path磁盘空间)。
✅ 推荐:只在需要大上传的
location中设置client_max_body_size,避免全局放宽。
proxy_buffer 相关参数(反向代理场景)
当 Nginx 作网关或代理时,后端响应也可能触发缓冲保护(表现为 502/504 或日志里 upstream sent too big header):
-
proxy_buffer_size 8k;
专用于响应头(含 Set-Cookie、自定义字段),必须能装下完整 header。 -
proxy_buffers 16 16k;
响应体缓冲总容量为 256KB;大报表、导出接口建议调高。 -
proxy_busy_buffers_size 32k;
应 ≤ 总 buffer 容量,且 ≥proxy_buffer_size,控制“边收边发”阶段的推送上限。
必配加固项(防慢速与绕过)
光调大小不够,还需控时间和行为:
-
client_header_timeout 5s;
防 Slow HTTP Header Attack:逐字节发头、拖住连接。 -
underscores_in_headers off;
禁用下划线解析,避免X_Api_Key被误转为x-api-key导致鉴权绕过。 -
reset_timedout_connection on;
对空闲超时连接立即发 RST,快速释放缓冲和连接槽位。
HTTP/2 场景额外要求
若启用 listen 443 ssl http2;,必须补充:
-
http2_max_header_size 32k; -
http2_max_field_size 4k;
否则前面的client_header_buffer_size等配置对 HTTP/2 请求无效。
不复杂但容易忽略


















