要防止畸形超长请求头溢出攻击,必须协同配置client_header_buffer_size(如2k或4k)和large_client_header_buffers(如4 8k),前者为初始缓冲门槛,后者为扩容通道;不匹配则直接返回400;还需配合client_header_timeout 5s、underscores_in_headers off、http/2专属参数及uri长度拦截等加固措施。

要防止畸形超长请求头导致的缓冲区溢出,不能只调大一个参数,得让 client_header_buffer_size 和 large_client_header_buffers 协同工作——前者是第一道门槛,后者是扩容通道,两者不匹配,Nginx 直接返回 400 错误。
设好两级缓冲大小
初始缓冲要够用但不过度宽松:
-
client_header_buffer_size 2k;或4k;:覆盖典型 JWT(1.2–2.5KB)、多域名 Cookie 和基础追踪头,比默认 1k 更稳妥 -
large_client_header_buffers 4 8k;:表示最多启用 4 个缓冲区,每个 8KB;单个请求头必须能放进其中一个 buffer,所以最大支持 8KB,总上限为 32KB - 严禁设成
large_client_header_buffers 1 64k或1m:攻击者可构造单行超长头反复建连,快速耗尽 worker 进程堆内存
配套时间与行为限制不能少
光控长度还不够,慢速攻击和解析绕过同样危险:
-
client_header_timeout 5s;:从连接建立开始计时,超时未发完请求头就断连,防 Slow HTTP Header Attack -
underscores_in_headers off;:禁用下划线解析,避免X_Api_Key被转成x_api_key绕过鉴权或触发头膨胀 - 对 URI 过长的请求,可在 location 块中加:
if ($request_uri ~ "^.{8192,}$") { return 414; },提前拦截,不进缓冲分配流程
HTTP/2 场景必须额外配置
启用了 listen 443 ssl http2; 的站点,仅调上面两个参数无效:
-
http2_max_header_size 32k;:控制整个请求头块(所有字段总和)最大体积 -
http2_max_field_size 4k;:限制单个 header 字段值长度,比如防超长User-Agent或伪造的Authorization - 这两个值需与
large_client_header_buffers的单 buffer 大小保持一致或略小,否则实际生效的是更严的那个
验证是否真正生效
改完配置后别跳过验证步骤:
- 重载 Nginx:
nginx -t && nginx -s reload - 用 curl 构造超长头测试:
curl -H "X-Test: $(printf 'a%.0s' {1..9000})" https://your.site/,应返回 400 - 检查 error.log 是否出现
request header or cookie too large,确认拦截发生在缓冲分配阶段,而非后端或代理层











