java项目请求url存在特殊字符 400错误

java项目请求url特殊字符 400错误

1 现象

请求路径带特殊字符,就会400错误,这就泄露了服务器版本和报错信息,无疑是敏感信息泄露,实属安全漏洞。

补充项目环境:springmvc、tomcat 8.5.59
java项目请求url存在特殊字符 400错误_第1张图片

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;
}

你可能感兴趣的:(经验分享,问题大杂烩,tomcat,服务器,spring,java,mvc)