web-dev-qa-db-ja.com

TomcatにURLでエスケープされていないブラケットを受け入れさせるにはどうすればよいですか?

これまでTomcatを使用したことはありませんが、最近、JSPプロジェクトを継承したため、実行する必要があります。 EclipseにTomcat8.0をローカルにインストールできましたが、すべて正常に動作します。また、UbuntuVPSにTomcat8.0をインストールしました。 URLの処理方法に関する小さな問題を除いて、アプリは問題なく実行されています。

クライアント側アプリケーションは、次のように、パラメーターにエスケープされていない角括弧と中括弧を含むURLを生成します。

GET /saveItems.json?items=[{%22json%22:%22here%22}]

クライアント側のアプリを変更したいのですが、変更できません。このバックエンドを実行する必要があります。

アプリケーションの私のローカルコピーはこれをうまく処理します。ただし、サーバーでは、次のエラーが発生します。

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.AbstractNioInputBuffer.parseRequestLine(AbstractNioInputBuffer.Java:286)
    at org.Apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.Java:1009)
    at org.Apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.Java:672)
    at org.Apache.Tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.Java:1504)
    at org.Apache.Tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.Java:1460)
    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:748)

運が悪ければ、これに影響を与える可能性のある設定を探していました。ここで何が欠けていますか?

7
cbnz

$ CATALINA_HOME\conf\server.xmlを編集してこれを実行可能にします

古い値:<Connector ... protocol="HTTP/1.1"... />

新しい値:<Connector ... protocol="HTTP/1.1"... relaxedQueryChars='[]|{}^&#x5c;&#x60;&quot;&lt;&gt;' />

8
Latif

Tomcat 8.0.39/8.5.9/7.0.73HTTPリクエスト行の解析に有効な文字のチェックを追加します。 この要件 によると、version 8.0.42/8.5.12/7.0.76いくつかの無効な文字を許可するように変更を加えます。
{}および|は、システムプロパティの値に文字が存在する場合に許可されますTomcat.util.http.parser.HttpParser.requestTargetAllow

システムプロパティを追加できますTomcat.util.http.parser.HttpParser.requestTargetAllow={}このエラーを防止します。解決策の1つは、編集$CATALINA_HOME\conf\catalina.properties

6
Beck Yang

特別な文字でGET URLしようとすると、このエラーが発生します。

Java.lang.IllegalArgumentException:リクエストターゲットで無効な文字が見つかりました。

server.xmlのコネクタパラメータを変更することで、Tomcatバージョン9の特殊文字を解析できます。

Connector port="80" protocol="HTTP/1.1" relaxedQueryChars="\ { } |" 
2
pravin patil

同様の問題が発生していましたが、Springブートも使用して、次の解決策で問題が解決しました。

@Bean
public ConfigurableServletWebServerFactory webServerFactory() {
    TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
    factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {
        @Override
        public void customize(Connector connector) {
            connector.setProperty("relaxedQueryChars", "|{}[]");
        }
    });
return factory;
}

クレジット Matthias-lohr - https://stackoverflow.com/questions/46251131/invalid-character-found-in-the-request-target-in-spring-boot =

0
Leroy