Tomcat高版本版本过滤特殊字符{ }[ ] | \的问题及requestTargetAllow用法

最近项目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 C o n n e c t i o n H a n d l e r . p r o c e s s ( A b s t r a c t P r o t o c o l . j a v a : 853 ) o r g . a p a c h e . t o m c a t . u t i l . n e t . N i o E n d p o i n t ConnectionHandler.process(AbstractProtocol.java:853) org.apache.tomcat.util.net.NioEndpoint ConnectionHandler.process(AbstractProtocol.java:853)org.apache.tomcat.util.net.NioEndpointSocketProcessor.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 W o r k e r . r u n ( T h r e a d P o o l E x e c u t o r . j a v a : 624 ) o r g . a p a c h e . t o m c a t . u t i l . t h r e a d s . T a s k T h r e a d Worker.run(ThreadPoolExecutor.java:624) org.apache.tomcat.util.threads.TaskThread Worker.run(ThreadPoolExecutor.java:624)org.apache.tomcat.util.threads.TaskThreadWrappingRunnable.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.

出现这种问题的原因是在低版本中存在安全漏洞代号CVE-2016-6816
在高版本被修复,高版本默认不允许在访问路径后边追加不符合RFC 3986文档规定的字符(注意有些字符虽然符合文档规范,但是可能不安全存在歧义,也会被拦截,比如 [])

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

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

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

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

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

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

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

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

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

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

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

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

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值