这是最近碰到的一个坑。
现象:服务端返回empty
直接现象是client端发起HTTP请求之后,得到empty的返回,以curl工具为例,得到如下错误:
Empty reply from server
Action 1:查查node server端日志,没有
去查node server端的日志:没有,什么也没有,好像没有收到请求。
Action 2:查看tcpdump记录,有情况
使用杀手锏tcpdump:
image.png可以看到奇怪的现象:
- 普通的GET请求,不管业务是否正确,都能返回一个HTTP response
- PUT(Headers超大的)请求的HTTP request没有对应的response,只有TCP层的ACK
那么可以确认两点:
- Server端确实收到的请求
- Server端没有返回HTTP层的response,虽然TCP层可能返回了。
猜测:肯定是node server出问题了
Server端收到请求后,并没有向上传送给业务层,导致在server端看不到任何日志,就像没有收到一样;然后Server端直接丢弃了请求,关闭了TCP层的连接。
正巧的是把完整的request都打出来了,感觉HTTP Headers有点长,都是些什么垃圾消息;网上一阵google找到如下:
Denial of Service with large HTTP headers (CVE-2018-12121)
https://nodejs.org/en/blog/vulnerability/november-2018-security-releases/#denial-of-service-with-large-http-headers-cve-2018-12121
经过验证,删除不必要的Headers,一切恢复OK。
结论:node本身的bug
是Headers的大小不能超过8K字节。而且我们使用的node版本还不支持--max-http-header-size去修改大小。
网友评论