Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

2021-6-15 14:08:41 org.apache.coyote.http11.AbstractHttp11Processor process
信息: 解析 HTTP 请求 header 错误
Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level.
java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986
at org.apache.coyote.http11.InternalInputBuffer.parseRequestLine(InternalInputBuffer.java:206)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1108)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:654)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:317)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:662)
报错解释: 请求头中包含了 RFC 7230 and RFC 3986规范中定义的非法字符,在这种情况下就会导致页面报400异常。
问题:
Tomcat抛出异常,导致400 错误请求。
从7.0.88开始,大多数tomcat版本都会出现此问题。
Tomcat增强了其安全性,并且不再允许在查询字符串中使用原始方括号。在请求中,我们url中有特殊符号,因此服务器未处理该请求。
RFC3986文档规定,Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符。
RFC3986中指定了以下字符为保留字符:
! * ’ ( ) ; : @ & = + $ / ? # [ ]
URL中不能包含的特殊字符:
键盘上那些控制键:(<32或者=127)非英文字符(>127)空格(32)双引号(34)#(35)<(60)>(62)反斜杠\(92)^(94)TAB上面那个键,~(96){(123)}(124)|(125)
解决方案(由Apache团队建议):
方法一:
在tomcat conf路径下的server.xml文件里面的 Connector 标签下添加属性 relaxedQueryChars:
<!-- 如果应用程序需要默认情况下tomcat不支持的更多特殊字符,请在relaxedQueryChars上述属性中添加这些特殊字符,并以逗号分隔。 -->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="utf-8"
relaxedQueryChars="\,|"/>

方法二(不推荐):
降低tomcat版本。
方法三:
将get请求改为post请求。
当请求头包含RFC 7230和RFC 3986中未定义的字符时,Tomcat会抛出400错误。从7.0.88版起,Tomcat加强安全限制,不允许URL查询字符串使用原始方括号。解决方法包括修改Tomcat配置文件server.xml添加relaxedQueryChars属性,降级Tomcat版本,或转换请求类型为POST。

5163

被折叠的 条评论
为什么被折叠?



