2016-12-09 39 views
25

私はTomcat 8を使用しています。あるケースでは、要求が外部のソースから来ている外部リクエストを処理する必要があります。リクエストには、|で区切られたパラメータがあります。私はエラー以下になっています。この場合Tomcat 8は '|'でリクエストを処理できませんクエリパラメータで

http://localhost:8080/app/handleResponse?msg=name|id|

要求は次のようになります。

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.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:467) 
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:667) 
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:789) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1455) 
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 

EDITは1

これは、Apache Tomcatを8.0.30で動作しますが、ないのTomcat 8.5と

+5

OK、私は –

+0

はあなたに見ていた持っているあなたはそれをエスケープする必要がありますねRFC? – clemens

答えて

29

この動作は、すべての主要なTomcatのリリースで導入されています

  • Tomcatの7.0.73クイックフィックスについては、8.0.398.5.7

、古いバージョンのいずれかにダウングレードするか、requestTargetAllowオプション(see Jérémie's answer)を設定してください。 (RFC 7231で必要とされる)のトークンでないHTTPメソッド名を持つ要求が拒否されていることを確認し

のTomcat 8.5.3:

changelogに基づいて、それらの変更はこの動作に影響を与える可能性があります400応答で

のTomcat 8.5.7:

無効な要求行がより早く拒否されるように、HTTP要求行の解析に有効な文字のチェックを追加します。


しかし、最終的に、あなたは、クライアント上のURLをエンコードしたい:

encodeURI("http://localhost:8080/app/handleResponse?msg=name|id|") 
> http://localhost:8080/app/handleResponse?msg=name%7Cid%7C 

か、単にクエリ文字列:

​​

それは他の問題の文字(list of invalid URI characters)からあなたを確保します。

+1

ありがとう、私は '' apache-tomcat-8.5.11''を '' apache-tomcat-8.0.30''に格下げしました。 –

3

エスケープそれ。パイプシンボルは、時間の経過とともにブラウザ間で異なって処理されたシンボルです。たとえば、ChromeとFirefoxでは、コピー/貼り付け時にパイプでURLを別々に変換します。しかし、それはそう最も互換性のある、とTomcat 8.5で必要な、それをエスケープすることです:

http://localhost:8080/app/handleResponse?msg=name%7Cid%7C

30

以降、Tomcat 7.0.76,8.0です。428.5.12のように、プロパティーrequestTargetAllowを定義してforbiden文字を許可することができます。

あなたcatalina.properties

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

にこの行を追加します。URIはUTF-8としてエンコードされますが、TomcatはISO-8859-1としてそれらをデコードしています。 server.xmlのコネクタ設定を編集し、URIEncoding = "UTF-8"属性を追加する必要があります。

たりapplication.propertiesに、このパラメータを編集

server.tomcat.uriエンコード= UTF-8

+0

server.xml内の要素のURIEncoding属性が具体的なもの(例:URIEncoding = "UTF-8")(https://wiki.apache.org/tomcat/FAQ/CharacterEncoding) – hwak

関連する問題