必须显式配置LimitRequestFields为40等合理值,因默认100仅为历史兼容而非安全设定;现代应用易超50头,攻击者可发数百空头耗尽内存;须全局配置于主配置文件,禁用.htaccess,并配合LimitRequestFieldSize 2048才能闭环防护。

直接在主配置文件里设一个明确数值,比如 LimitRequestFields 40,比默认的100更安全,也足够覆盖正常业务请求。
为什么必须显式配置这个值
Apache 默认允许 100 个请求头,但这不是出于安全考虑,而是历史兼容设定。现代应用中,前端框架、监控 SDK、JWT 透传、多层网关注入等会让请求头轻松超过 50 个。攻击者只要发几百个空头(如 X-Foo-001: a 到 X-Foo-500: a),Apache 就会为每个头分配内存、复制字符串、维护链表,最终导致内存耗尽或解析超时,服务变慢甚至返回 500 错误。
正确配置的位置和方式
这个指令不能写在 .htaccess 里——它不支持目录级覆盖,Apache 启动时会直接报错 Invalid command 'LimitRequestFields'。必须放在全局生效位置:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- Debian/Ubuntu 系统:编辑
/etc/apache2/apache2.conf - RHEL/CentOS/Rocky/AlmaLinux 系统:编辑
/etc/httpd/conf/httpd.conf - 在主配置段(非虚拟主机内部)添加一行:
LimitRequestFields 40 - 保存后运行
apache2ctl configtest(或httpd -t)验证语法,再重启服务
配合 LimitRequestFieldSize 才算完整防护
只限制数量不够,攻击者可以发 30 个超长头(比如单个 8KB 的 Cookie),照样撑爆缓冲区。必须一起配:
-
LimitRequestFieldSize 2048:单个 Header 值最大 2048 字节(注意是字节数,不是字符数) - 该值影响所有头,包括 Host 和 User-Agent;若某些 IoT 设备上报极长 User-Agent,需实测确认下限
- 不要设为 0 或极大值(如 65536),Apache 内部用固定栈缓冲区解析,超出会 fallback 到堆分配,反而扩大攻击面
验证是否真正生效
配完不验证等于没配。重点检查三项:
- 确认 MPM 模块已加载:
apache2ctl -M | grep mpm - 查看运行时配置:
apache2ctl -t -D DUMP_RUN_CFG | grep LimitRequest,输出应包含你设置的数值 - 用 curl 构造测试请求:
curl -H "X-Test-1: a" -H "X-Test-2: b" ... http://your-site/,逐步增加头数量,观察是否在第 41 个头时被拒绝(返回 400)










