java项目请求url特殊字符 400错误
1 现象
请求路径带特殊字符,就会400错误,这就泄露了服务器版本和报错信息,无疑是敏感信息泄露,实属安全漏洞。
补充项目环境:springmvc、tomcat 8.5.59
2 原因
经排查和报错信息得知,该请求是被tomcat解析报错的,还没有到我们的程序里面。
而Tomcat严格按照 RFC 3986规范进行访问解析,而 RFC 3986规范定义了Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符(RFC3986中指定了以下字符为保留字符:! * ’ ( ) ; : @ & = + $ , / ? # [ ])。传入的参数中有"[]“、”"不在RFC3986中的保留字段中,所以会报这个错。
3 解决方案
3.1 方案一 降低tomcat版本
tomcat7.9以下版本
3.2 方案二 修改tomcat的配置文件,允许url存在指定特殊字符
在server.xml文件中 Connector标签增加 relaxedQueryChars=“[]|{}^\`”<>" 属性,最终如下
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" relaxedQueryChars="[]|{}^\`"<>" redirectPort="8443" />
但是需要把所有的特殊字符都加上才可以。
3.3 方案三 修改tomcat配置隐藏报错敏感信息
在此上方,它将为您提供状态报告信息(HTTP状态)和服务器信息。因此,您可以在Tomcat服务器的conf 中使用server.xml对其进行配置。
默认的Catalina错误报告阀门和配置:org.apache.catalina.valves.ErrorReportValve
属性 | 描述 |
---|---|
showReport | 如果发生错误,用于在错误页面上显示错误信息(状态代码及其信息)的标志。默认值是true |
showServerInfo | 如果发生任何错误,则用于在错误页面上显示当前服务器信息的标志。默认值是true |
现在,添加/更新以下内容以在**** 中的server.xml中进行配置。
<Valve className="org.apache.catalina.valves.ErrorReportValve" showReport="false" showServerInfo="false" />
这种方法只会显示
只会显示出HTTP 400 错误,不会打印堆栈和tomcat版本号信息
3.4 方案四 修改nginx配置文件的错误页
在nginx.conf文件中配置如下配置,这个配置目的是,响应400会转发的400.html,达到屏蔽掉tomcat默认错误配置页的效果。
error_page 400 /400.html;
location = /400.html {
root html;
}