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

时间:2017-02-20 09:00:47

标签: tomcat pipe unsafe

当我尝试使用我的java网络应用中的网址发送GET请求时出现错误:我的本地计算机网址如下所示 http://localhost:8080/test?param1=1|2&param2=3343434

  

2017年2月20日下午4:51:19 org.apache.coyote.http11.AbstractHttp11Processor进程   信息:解析HTTP请求标头时出错    注意:将在DEBUG级别记录更多出现的HTTP头解析错误。   java.lang.IllegalArgumentException:在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义       at org.apache.coyote.http11.AbstractNioInputBuffer.parseRequestLine(AbstractNioInputBuffer.java:283)       在org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1017)       at 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:1480)       at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)       at java.util.concurrent.ThreadPoolExecutor $ Worker.run(Unknown Source)       at org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61)       在java.lang.Thread.run(未知来源)

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

2 个答案:

答案 0 :(得分:4)

过去的一天,我一直在为此而奋斗。我尝试在tomcat中使用mod_rewrite尝试urlencode'|'在进入但错误仍然存​​在,因为它在到达重写引擎之前被抛出。所以没有运气。 我找到的唯一两个工作解决方案是:

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

答案 1 :(得分:3)

自Tomcat 8.5.8起,这不再有用。

请求网址中存在无效字符的安全错误。

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

将管道编码为%7C