记一次Error parsing HTTP request header问题解决

序言

近期在做一个抓取网络数据包进行分析的项目,使用springboot框架,基于pcap4j实现,大致的逻辑就是抓取数据包,解析一些常用信息,然后收集所有IP,最后通过nmap主动嗅探给定范围主机的信息,包括操作系统以及端口开放情况,运行的服务等等。

前半段一切顺利,在对抓取到的IP使用nmap主动探测时,总是会在控制台打印一段错误日志:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
2024-08-08 18:14:17.078  INFO 5460 --- [nio-8080-exec-5] o.apache.coyote.http11.Http11Processor   : Error parsing HTTP request header
Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level.

java.lang.IllegalArgumentException: Invalid character found in the HTTP protocol [RTSP/1.00x0d0x0a0x0d0x0a...]
at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:570) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:271) ~[tomcat-embed-core-9.0.68.jar:9.0.68]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.68.jar:9.0.68]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893) [tomcat-embed-core-9.0.68.jar:9.0.68]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1789) [tomcat-embed-core-9.0.68.jar:9.0.68]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.68.jar:9.0.68]
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) [tomcat-embed-core-9.0.68.jar:9.0.68]
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) [tomcat-embed-core-9.0.68.jar:9.0.68]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.68.jar:9.0.68]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_301]

疑惑

由于此前从未遇到这个问题,所以首要目的是搞清楚这个问题意味着什么,对症下药才能彻底解决。

经过查询资料找到三个主要产生问题的原因。

传入的HTTP标头比预期要大

内置的tomcat服务器默认接受的HTTP最大标头为8k

因为过大的标头会消耗更多的内存,可能会降低请求速度,甚至导致服务器崩溃。

所以限制标头的大小是一种安全的做法。

我们可以通过一行配置修改默认接受的最大标头大小:

1
server.max-http-header-size=64000

我试着修改配置文件,但最终还是无法解决问题。

服务器接收HTTP而客户端使用HTTPS

服务的希望接收一个未加密的标头,如果客户端使用HTTPS请求服务器,服务器也会因为无法解析客户端加密的标头而提示错误。

但是在抓包的整个过程我没有主动使用HTTPS请求服务器。

服务器接收到一个不符合HTTP标头规范的请求

由于抓包中存在我本机IP,同时使用nmap对主机上所有常见端口进行扫描,这就包括了我的服务监听的8080端口,nmap通过发送TCP SYN包来监测端口是否开放,此时这个包并不符合HTTP标头规范,所以tomcat服务器尝试解析标头时出现错误。

解决办法

最终修改nmap的扫描命令,排除本地8080端口后报错消失。


记一次Error parsing HTTP request header问题解决
https://seeyourface.cn/2024/08/08/记一次Error parsing HTTP request header问题解决/
作者
Yang Lei
发布于
2024年8月8日
许可协议