70

私は 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)

編集1

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

4

7 に答える 7

77

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

  • トムキャット7.0.73、8.0.39、8.5.7 _ _ _

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

  • この文字を許可するように設定relaxedQueryCharsします(推奨、リンカーンの回答を参照
  • setrequestTargetAllowオプション (Tomcat 8.5 で非推奨) ( Jérémie の回答を参照)。
  • 古いバージョンのいずれかにダウングレードできます (非推奨 - セキュリティ)

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

トムキャット 8.5.3:

トークンではない HTTP メソッド名 (RFC 7231 で要求されている) を含むリクエストが 400 レスポンスで拒否されるようにする

トムキャット 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 文字のリスト)から保護します。

于 2016-12-14T19:18:26.453 に答える