Tomcat9.0.22版本过滤特殊字符{ }[ ] | \的问题

最近项目tomcat升级,从6升到9,碰到了一系列问题。其中,拼特殊字符串时,会报错。报错显示

java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
	org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:468)
	org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:294)
	org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:853)
	org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1587)
	org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	java.lang.Thread.run(Thread.java:748)

Note The full stack trace of the root cause is available in the server logs.

根据网上查的资料,解决思路有几种。降级tomcat,配属性文件等。

先分析将tomcat降级的情况,这是不合理的,升级tomcat是为了项目运行更流畅。tomcat6用的是bio,tomcat9用的是nio,很显然nio比bio更流畅,而且也能解决tomcat漏洞。

配属性文件这种方法,在tomcat8.5,tomcat7里面可行,解决办法如下:

Tomcat9.0.22版本过滤特殊字符{ }[ ] | \的问题_第1张图片

Tomcat9.0.22版本过滤特殊字符{ }[ ] | \的问题_第2张图片

tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}

这行配置在属性文件中是注释掉的,需要放开注释

其中,属性文件value值的配置,只能配置| { }这三个值,如果要配置[ ] \ 这种值是不起作用的

而且,这种办法对9.0.22一系列tomcat9的版本是不起作用的,因为属性文件中没有这些注释,配置了也没有用。根据文档,直接说解决办法。

Tomcat9.0.22版本过滤特殊字符{ }[ ] | \的问题_第3张图片

在server.xml文件的Connector连接器中,增加这两个属性配置,key值为属性名,value值是要过滤的字符串的值,配置如下:

relaxedPathChars="|{}[\]^"   relaxedQueryChars="|{}[\]^"  

配置完成后,重新启动服务,经过验证,是可行的

Tomcat9.0.22版本过滤特殊字符{ }[ ] | \的问题_第4张图片

有一点需要注意:这两个属性值,如果你需要配置,千万注意  <>  的配置,配置不对,tomcat启动不起来。这两个属性是全局的属性配置,在tomcat7、tomcat8中也可以配置

属性文件的文档资料链接地址:https://tomcat.apache.org/tomcat-9.0-doc/config/http.html

你可能感兴趣的:(tomcat,Invalid,character,found,in,the,The,valid,characters,are,defin,tomcat过滤特殊字符)