报错和现象
当url中有特殊字符时,高版本tomcat会显示400页面,页面暴露了版本信息和部分堆栈,参考部分报错关键字:
The valid characters are defined in RFC 7230 and RFC 3986
如何解决
主要解决办法有如下几个:
- 此报错是高版本tomcat才出现,所以可以更换低版本来解决此问题,但同时需要考虑低版本tomcat是否有其他安全问题
- 在tomcat/conf/server.xml的端口配置下增加如下配置:
relaxedPathChars='\":[]|' relaxedQueryChars='\":[]|'
同时在tomcat/conf/catalina.properties追加如下配置:
tomcat.util.http.parser.HttpParser.requestTargetAllow=|{} org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true
但这两个配置文件不能解决所有问题,只能解决部分上面列出的特殊符号问题,如果有一些其他更特殊的符号未添加或者遗漏,那么仍然可能报错
- 在tomcat/conf/server.xml的Host标签内加入以下代码:
<Valve className="org.apache.catalina.valves.ErrorReportValve" showReport="false" showServerInfo="false" />
这种方式仍然会显示400错误,但不会输出错误堆栈,也算是比较好的解决方案了
方案对比
- 方案一需要回退低版本,存在其他安全风险
- 方案二使得列出的字符可以被正常请求,与高版本tomcat禁止这些字符来提升安全相背离
- 方案三是仍然禁止这些字符,但仅不显示版本和错误堆栈,可以保证服务安全