nginx控制请求头大小是主动设限而非修复漏洞,通过client_header_buffer_size(如2k)和large_client_header_buffers(如4 8k→32kb)两级缓冲拒绝超长头,超限即返400;http/2需额外配置http2_max_header_size等参数,并配合client_header_timeout、underscores_in_headers off等防慢速攻击与绕过。

Nginx 控制请求头大小不是为了“修复溢出漏洞”,而是主动设限,防止恶意或异常请求耗尽 worker 内存。它靠两级缓冲机制做判断,超限就返回 400,不给攻击者留机会。
核心是管住两个缓冲区
Nginx 不是等内存真爆了才反应,而是在分配阶段就拒绝超规格请求:
- client_header_buffer_size:每个请求默认只分一块小缓冲(如 1k 或 2k),够普通 GET,但 JWT Token、多域名 Cookie、长 traceparent 头就容易撑爆
-
large_client_header_buffers:当小缓冲不够时启用备用池,格式是
large_client_header_buffers 4 8k,表示最多用 4 块 8KB 缓冲 → 总上限 32KB。只要请求头总长度超过这个值,立刻 400,并在 error.log 记request header or cookie too large
HTTP/2 场景要额外设限
如果启用了 HTTP/2(listen ... http2),光调上面两个还不够:
- http2_max_header_size:控制整个头部块(所有字段加起来)最大体积,建议设为 32k
- http2_max_field_size:限制单个 header 字段值长度,默认 4k,防超长 User-Agent 或伪造 Authorization
不能只加大小,还得控时间和行为
攻击者可能不拼长度,而拼“慢”——逐字节发头字段,拖住连接:
- client_header_timeout:设为 5s 或 10s,超时直接断连,防 Slow HTTP Header Attack
- underscores_in_headers off:禁用下划线,避免某些框架把 X_Api_Key 解析成 x_api_key,造成校验绕过或头膨胀
- 若业务允许,可配合 limit_req 按 IP 限速,防自动化头轰炸
调参后要验证是否生效
- 查 error.log 是否还有
request header or cookie too large - 用 curl 测试边界值:
curl -H "X-Test: $(printf 'a%.0s' {1..33000})" @#@#@#@#@#@#@#@#@#@0
应返回 400(HTTP/1.1)或 431(HTTP/2) - 确保后端应用也做头长度校验,Nginx 拦不住的异常头别让它进业务逻辑
不复杂但容易忽略











