web-dev-qa-db-ja.com

Tomcat 8は '|'でgetリクエストを処理できませんクエリパラメータで?

Tomcat 8を使用しています。1つのケースでは、|で区切られたパラメーターを持つ外部ソースからの外部要求を処理する必要があります。

リクエストは次のようになります。

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)

編集1

Apache Tomcat 8.0.30で動作しますが、Tomcat 8.5では動作しません

52
ashishjmeshram

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

  • Tomcat7.0.738.0.398.5.7

修正するには、次のいずれかを実行します。


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

Tomcat 8.5.3:

トークンではないHTTPメソッド名(RFC 7231で要求される)を持つ要求が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

または単にクエリ文字列:

encodeURIComponent("msg=name|id|")
> msg%3Dname%7Cid%7C

他の問題のある文字( 無効なURI文字のリスト )から保護します。

57

Tomcat7.0.768.0.428.5.12プロパティ requestTargetAllow を定義して、禁止文字を許可できます。

この行をcatalina.propertiesに追加します

Tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
47

問題:Tomcat(7.0.88)が例外の下にスローされ、400 – Bad Requestになります。

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

この問題は、7.0.88以降のほとんどのTomcatバージョンで発生しています。

解決策:(Apacheチームが推奨):

Tomcatはセキュリティを強化し、クエリ文字列に生の角括弧を許可しなくなりました。リクエストには[、](角かっこ)があるため、リクエストはサーバーによって処理されません。

Server.xmlの下のタグの下にrelaxedQueryChars属性を追加します(%Tomcat_HOME%/ conf):

<Connector port="80" 
           protocol="HTTP/1.1"
           maxThreads="150"
           connectionTimeout="20000"
           redirectPort="443"
           compression="on"
           compressionMinSize="2048"
           noCompressionUserAgents="gozilla, traviata"
           compressableMimeType="text/html,text/xml"
                                     relaxedQueryChars="[,]"
             />

アプリケーションがデフォルトでTomcatでサポートされていない特殊文字をさらに必要とする場合、上記のようにコンマで区切られたrelaxedQueryChars属性にそれらの特殊文字を追加します。

パラメーターTomcat.util.http.parser.HttpParser.requestTargetAllowは、Tomcat 8.5以降では非推奨です: Tomcat official doc

コネクタ定義でrelaxedQueryChars / relaxedPathCharsを使用して、これらの文字を許可できます: Tomcat official doc

11
Lincoln

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

または、application.propertiesでこのパラメーターを編集します

server.Tomcat.uri-encoding = utf-8

5

それをエスケープします。パイプ記号は、時間の経過とブラウザ間で異なる方法で処理されたものです。たとえば、ChromeとFirefoxは、コピー/貼り付けの際にURLをパイプで異なる方法で変換します。ただし、Tomcat 8.5と最も互換性があり、必要なのは、Tomcat 8.5をエスケープすることです。

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

4
Dan Armstrong