记录下Tomcat升级9.0.45引起的400问题

升级版本

目前使用版本:Tomcat9.0.37

升级版本:Tomcat9.0.45

升级后现象

IE浏览器下面出现白屏,静态资源(css、js等)全部出现400错误,刷新页面也一样,但是禁用浏览器缓存问题就消失了。

其他浏览器在第一次访问的时候也有类似现象,但是刷新页面就好了。

image-20210511163739733

问题排查

对比请求

IE浏览器下开启和关闭缓存现象不一样,只有在开启缓存的时候才出现400问题。

缓存关闭请求:

1

缓存开启请求:

发现开启缓存之后多了两个Header:If-Modified-Since和If-None-Match

问题搜索

搜索类似现象,发现是再做Xss跨站攻击转义的时候对header做了转义引起。

http://tomcat.10.x6.nabble.com/Failing-If-None-Match-header-in-DefaultServlet-Tomcat-9-0-41-td5106925.html

https://bz.apache.org/bugzilla/show_bug.cgi?id=64816

但是在9.0.37以前版本是正常的

最终问题原因

Tomcat9.0.38版本对If-None-Match和If-Match头信息做了强校验,格式要求严格,错误的格式都返回400错误。

https://github.com/apache/tomcat/compare/9.0.37...9.0.38#diff-3f35faae1cd5ab38847d08c8d657c9fd32ba532716588c47296e54e5efb4bc9bR2246

image-20210511164521042

Tomcat源码:org.apache.catalina.servlets.DefaultServlet#checkIfMatch

image-20210511165348527

问题解决

在做Xss转义的时候不能对If-None-Match和If-Match头信息做处理,其实原来的转义的做法并不正确,虽然在tomcat下没有什么错误,但是会造成js和css等静态文件浏览器缓存失效。

上一篇
下一篇