LimitRequestFields 是 Apache 必须显式配置的安全基线,应设为40并全局置于主配置文件,同时必须配合 LimitRequestFieldSize 2048 才能有效防御头部数量及长度型攻击。

LimitRequestFields 是 Apache 防御头部数量型应用层攻击的关键配置,不是“可选优化”,而是必须显式收紧的安全基线。默认值 100 是兼容性妥协,现代合法请求常含 30–60 个头(Authorization、X-Request-ID、Sec-Fetch-*、多个 Cookie、前端 SDK 注入头等),攻击者发 200 个空头即可触发内存耗尽或解析超时,导致 500 错误或服务挂起。
必须全局配置,禁止写在 .htaccess
该指令不支持目录级覆盖,写在 .htaccess 中会直接报错:Invalid command 'LimitRequestFields'。它只在服务器级或
- Debian/Ubuntu:编辑 /etc/apache2/apache2.conf,放在
<IfModule mpm_event_module>外的主配置段 - RHEL/CentOS/Rocky:编辑 /etc/httpd/conf/httpd.conf
- 添加一行:LimitRequestFields 40(40 覆盖绝大多数业务场景,比 100 安全,又比 20 宽松)
必须配合 LimitRequestFieldSize 才算闭环
只限数量不限长度,等于留后门。攻击者可发 35 个头,其中一个是 8KB 的恶意 JWT 或伪造 Cookie,照样撑爆解析缓冲区。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 同步设置:LimitRequestFieldSize 2048(单位是字节,非字符)
- 该值作用于所有头,包括 Host、User-Agent;若业务中有 IoT 设备上报超长 UA,需先抽样 access.log 确认实际最大长度
- 避免设为 0 或过大(如 65536):Apache 内部用栈缓冲区解析头,超出会退化到堆分配,扩大攻击面
验证是否真正生效,三步缺一不可
配置写完不验证,等于没配。
- 检查运行时加载值:apache2ctl -t -D DUMP_RUN_CFG | grep -i limitrequest,输出应明确显示你设的数值(如
LimitRequestFields 40) - 构造越界请求测试:curl -H "X-Test-1: a" -H "X-Test-2: b" ... -H "X-Test-41: z" http://localhost/,应返回 400 Bad Request,而非 200 或 500
- 查看 error.log 是否有类似记录:
client sent too many request headers
常见误配与规避
这些错误会让防护完全失效:
- 设为 LimitRequestFields 1000:超出允许范围(1–100 整数),Apache 启动失败
- 只配在某个
内:其他入口(如默认主机、IP 直连)仍裸奔 - 忽略
外的全局配置:某些攻击路径绕过虚拟主机匹配,直接命中主配置上下文 - 未同步调整 LimitRequestFieldSize:单个超长头可绕过数量限制

















