LimitRequestFields是Apache限制单个HTTP请求头数量的指令,默认值100但不安全,需显式设为40等合理值并全局配置,配合LimitRequestFieldSize才能防内存耗尽攻击。

LimitRequestFields 是什么,为什么必须设数值
LimitRequestFields 控制单个 HTTP 请求中允许的请求头(Header)数量上限。Apache 默认值是 100,但这个值不是“安全默认”,而是历史兼容妥协——现代前端框架、监控 SDK、JWT 透传、多层网关注入等场景下,Cookie、X-Request-ID、Authorization、Referer 等头可能轻松堆到 50+,再加浏览器自动携带的 Sec-Fetch-* 系列,很容易触边。
不显式配置 LimitRequestFields,等于把解析器的内存分配逻辑暴露给攻击者:发送 500 个空头或伪造头(如 X-Foo-001: a … X-Foo-500: a),Apache 会为每个头分配结构体、复制字符串、维护链表,最终触发内存耗尽或解析超时,造成服务无响应或 500 错误。
怎么配才真正起效:位置、范围和典型值
必须写在生效作用域内,且不能被子配置覆盖。常见错误是只加在虚拟主机里,但攻击请求可能打到默认主机或未匹配的路径上。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 全局生效(推荐):写入
/etc/apache2/apache2.conf或/usr/local/apache2/conf/httpd.conf的主配置段,重启前用apache2ctl configtest验证 - 禁止写在
.htaccess中:该指令不支持目录级覆盖,Apache 启动时会直接报错Invalid command 'LimitRequestFields' - 典型业务值参考:
LimitRequestFields 40足够覆盖绝大多数合法请求(含 JWT + Sentry + CORS + 自定义追踪头),比默认 100 更紧,又比 20 宽松(避免误杀某些老旧管理后台)
配合 LimitRequestFieldSize 才算闭环
只限数量不防长度,攻击者可以发 30 个超长头(比如一个 8KB 的 Cookie),照样撑爆缓冲区。两者必须一起调。
-
LimitRequestFieldSize 2048:单个 Header 值最大字节数(不是字符数),防 Base64 Token、长 TraceID、恶意填充 - 注意:该值影响所有头,包括
Host和User-Agent;若后端依赖极长User-Agent(如某些 IoT 设备固件),需实测确认下限 - 不要设成 0 或极大值(如 65536):Apache 内部使用固定大小栈缓冲区解析头,超出会 fallback 到堆分配,增加攻击面
验证是否生效的三个关键点
配完不验证 = 白配。重点看这三项:
- 检查运行时值:
apache2ctl -M | grep mpm确认当前 MPM(event/prefork)已加载,再执行apache2ctl -t -D DUMP_RUN_CFG | grep LimitRequest,输出应包含你设置的数值 - 构造测试请求:用
curl -H "X-Test-1: a" -H "X-Test-2: b" ...发送超过阈值的头,应返回400 Bad Request,而不是 500 或超时 - 查 error.log:攻击触发时,日志中会出现类似
[core:error] [pid XXXX] AH00555: Request header exceeds LimitRequestFields的记录,这是唯一可信的生效证据
别只信配置文件里写了就完事——MPM 模块版本低、配置被 include 覆盖、或者用了 AJP 连接 Tomcat(AJP 协议自身有独立头限制),都可能导致实际未生效。

















