如何使 Apache Tomcat 8.0.41 允许 URL GET 请求中的管道字符?

las*_*koh 4 tomcat unsafe pipe

这是我尝试在我的 java web 应用程序中发送带有 URL 的 GET 请求时的错误:我的本地机器 url 看起来像这样http://localhost:8080/test?param1=1|2¶m2=3343434

2017 年 2 月 20 日下午 4:51:19 org.apache.coyote.http11.AbstractHttp11Processor 进程信息:解析 HTTP 请求标头时出错 注意:进一步发生的 HTTP 标头解析错误将在调试级别记录。java.lang.IllegalArgumentException: 在请求目标中发现无效字符。有效字符在 org.apache.coyote.http11.AbstractNioInputBuffer.parseRequestLine(AbstractNioInputBuffer.java:283) 处 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:10) 处的 RFC 7230 和 RFC 3986 中定义org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:684) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1524) 在 org.apache.tomcat.util。 net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:

我想问一下是否可以在不更改 Apache Tomcat 版本或更改现有代码的情况下解决此问题。我想知道 Apache Tomcat 配置文件是否能够禁用或绕过此检查?

Rad*_*asu 5

过去一天我一直在为这件事伤脑筋。我尝试在 tomcat 中使用 mod_rewrite 来尝试对 '|' 进行 urlencode 在输入时,但错误仍然存​​在,因为它在到达重写引擎之前被抛出。所以运气不佳。我发现的唯一两个可行的解决方案是:

  1. 在 Tomcat (nginx) 之前放置一个代理,它可以对管道进行 urlencode,而不会抛出合理的 IllegalArgumentException。
  2. 更改 Tomcat 版本(并非所有版本都会通过管道抛出合理的 IllegalArgumentExceptions)。在撰写本文时,我可以确认最新的 8.5.11 确实会抛出合理的 IllegalArgumentException,但8.5.5 工作正常。


Dom*_*nik 5

自 Tomcat 8.5.8 起,这不再有意为之。

请求 url 中存在包含无效字符的安全错误。

https://bugzilla.redhat.com/show_bug.cgi?id=1397484

将管道编码为 %7C