Apache配置需限制请求行、头长度及数量,并启用体大小校验与超时;Java端应增加Filter校验URI与Headers长度;AJP连接需升级Tomcat并调优或改用mod_proxy_http。

Java应用使用Apache HTTP Server(如通过mod_proxy或AJP连接Tomcat)时,若客户端发送超长URL或请求头(例如含极长Cookie、Referer、自定义Header),可能触发Apache内部缓冲区溢出,导致服务崩溃、500错误或拒绝服务。该风险不直接源于Java代码,但会波及后端Java应用的可用性。防范需从Apache配置与Java侧协同入手。
限制请求行与请求头长度
Apache默认LimitRequestLine为8190字节,LimitRequestFieldSize为8190字节,对现代含大量JWT Token或深度嵌套参数的请求已显不足,但更危险的是设得过大或禁用限制。应主动收紧并匹配业务实际需求:
-
LimitRequestLine 4096—— 足够覆盖绝大多数REST路径+查询参数 -
LimitRequestFieldSize 2048—— 控制单个Header(如Authorization、Cookie)长度,防恶意长Token注入 -
LimitRequestFields 100—— 防止Header数量爆炸(如重复提交数百个X-Trace-ID)
将上述指令置于主配置(httpd.conf)或虚拟主机段中,重启Apache生效。
启用请求体大小校验与超时控制
长路径常伴随超大POST体(如Base64编码大文件误放URL参数),需配合体限制和超时避免缓冲区持续积压:
立即学习“Java免费学习笔记(深入)”;
-
LimitRequestBody 10485760(10MB)—— 明确拒绝过大的请求体,避免内存耗尽 -
Timeout 30、KeepAliveTimeout 5—— 缩短空闲等待时间,防止慢速攻击拖住连接缓冲区 - 若使用mod_security,可添加规则拦截
REQUEST_URI长度超过2048字符的请求
Java端增加前置校验与日志追溯
Apache层拦截失败时,Java应用需有兜底能力。在Filter或Spring WebMvc的HandlerInterceptor中检查原始请求URI与Headers:
- 读取
request.getRequestURL().toString()和request.getQueryString()总长,超4096则返回414 URI Too Long - 遍历
request.getHeaderNames(),对每个Header值校验长度(如Cookie > 4096字节即拒收) - 记录被拦截请求的RemoteAddr、User-Agent、URI前128字符,便于溯源攻击模式
注意:校验应在字符解码前进行(即基于原始字节流或ISO-8859-1解析的URI),避免UTF-8多字节导致长度误判。
规避AJP协议固有缺陷(如适用)
若Apache通过AJP(如mod_jk)连接Tomcat,AJP v1.3协议本身对请求头长度限制较松(默认约64KB),且错误处理不完善,易成溢出入口。建议:
- 升级到Tomcat 9.0.31+ 或 10.0.2+,修复了AJP头解析多个缓冲区问题(CVE-2020-1938相关加固)
- 在
server.xml的AJP Connector中显式配置:packetSize="65536"并确保不超过Apache侧JkOptions +ForwardKeySize兼容值 - 生产环境优先改用HTTP/HTTPS反向代理(mod_proxy_http),语义清晰、标准完善、调试友好

















