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)

ИЗМЕНИТЬ 1

Он работает с Apache Tomcat 8.0.30, но не с Tomcat 8.5.


person ashishjmeshram    schedule 09.12.2016    source источник
comment
Хорошо, я думаю, тебе придется сбежать.   -  person Maurice Perry    schedule 09.12.2016
comment
Вы ознакомились с упомянутым RFC?   -  person clemens    schedule 09.12.2016


Ответы (7)


Это поведение представлено во всех основных выпусках Tomcat:

  • Tomcat 7.0.73, 8.0.39, 8.5.7

Чтобы исправить это, выполните одно из следующих действий:

  • установите relaxedQueryChars, чтобы разрешить этот символ (рекомендуется, см. ответ Линкольна)
  • установите параметр requestTargetAllow (устарел в Tomcat 8.5) (см. ответ Джереми).
  • вы можете перейти на одну из более старых версий (не рекомендуется - безопасность)

Судя по журналу изменений, эти изменения могут повлиять на это поведение:

Томкэт 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).

person Piotr Lewandowski    schedule 14.12.2016
comment
Спасибо, я только что понизил свой apache-tomcat-8.5.11 до apache-tomcat-8.0.30, и это сработало как шарм. - person Bhuwan Gautam; 07.03.2017
comment
@BhuwanGautam Я бы не рекомендовал понижать версию tomcat, поскольку в последних версиях tomcat есть все необходимые исправления CVE, которые уже могли повлиять на ваши версии с пониженной версией. Кодирование параметров URI было бы исправлением - или использование relaxedQueryChars - В долгосрочной перспективе любой код, который использует зарезервированные символы RFC 3986, должен быть реорганизован. - person ha9u63ar; 18.10.2018
comment
Кажется, relaxedQueryChars по-прежнему можно только взломать. Есть ли какое-либо правильное решение, предоставляемое Apache? - person Suresh; 20.11.2018
comment
Для меня encodeURIComponent работал как шарм! Tnx за описание альтернативных исправлений. - person ljader; 30.11.2020
comment
есть ли какие-либо изменения файла свойств в случае весенней загрузки? - person Hafiz Hamza; 03.03.2021

Начиная с Tomcat 7.0.76, 8.0.42, 8.5.12 вы можете определить свойство requestTargetAllow, чтобы разрешить использование запрещенных символов.

Добавьте эту строку в свой catalina.properties

tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
person Jérémie Lesage    schedule 16.05.2017
comment
Начиная с tomcat 8.5 и выше # ПРЕДУПРЕЖДЕНИЕ. Использование этого параметра может подвергнуть сервер риску заражения CVE-2016-6816 #tomcat.util.http.parser.HttpParser.requestTargetAllow=| - person Bhaskara Arani; 04.03.2019

Проблема: 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.

Эта проблема возникает в большинстве версий Tomcat, начиная с 7.0.88.

Решение: (предложено командой Apache):

Tomcat повысил свою безопасность и больше не допускает необработанных квадратных скобок в строке запроса. В запросе у нас есть [,] (квадратные скобки), поэтому запрос не обрабатывается сервером.

Добавьте атрибут relaxedQueryChars под тегом server.xml (%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, разделенные запятыми, как указано выше.

person rama krishna chinna reddy    schedule 21.08.2018
comment
У меня работает последний tomcat 8 для DHIS2, потому что это кому-то помогает !!! - person Daniel Adenew; 19.03.2019

Параметр tomcat.util.http.parser.HttpParser.requestTargetAllow устарел, начиная с Tomcat 8.5: официальный документ totomcat.

Вы можете использовать relaxedQueryChars / relaxedPathChars в определении соединителей, чтобы разрешить следующие символы: официальный документ tomcat< /а>.

person Lincoln    schedule 06.07.2018
comment
В 8.5 я пробовал это, и это не имело никакого эффекта. Лучший вариант — всегда кодировать ваши URL-адреса. - person sproketboy; 20.06.2019

URI кодируется как UTF-8, но Tomcat расшифровывает их как ISO-8859-1. Вам нужно отредактировать настройки коннектора в server.xml и добавить атрибут URIEncoding="UTF-8".

или отредактируйте этот параметр в вашем application.properties

server.tomcat.uri-кодирование = utf-8

person Omid Nazerizadeh    schedule 05.09.2017
comment
Атрибут URIEncoding в элементе ‹Connector› в server.xml на что-то конкретное (например, URIEncoding=UTF-8) (wiki.apache.org/tomcat/FAQ/CharacterEncoding) - person hwak; 30.11.2017
comment
@hwak ваша ссылка не работает - person payne; 06.02.2020
comment
нашел аналогичную ссылку cwiki.apache.org/confluence/display/TOMCAT/Character+Encoding - person hwak; 19.02.2020

Убежать от этого. Символ трубы — это тот, который со временем и в разных браузерах обрабатывался по-разному. Например, Chrome и Firefox по-разному преобразуют URL-адрес с вертикальной чертой при их копировании/вставке. Однако кажется, что наиболее совместимым и необходимым для Tomcat 8.5 является выход из него:

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

person Dan Armstrong    schedule 10.12.2016

Добавление атрибута RelaxQueryChars в server.xml сработало для меня:

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="443" URIEncoding="UTF-8" relaxedQueryChars="[]|{}^&#x5c;&#x60;&quot;&lt;&gt;"/>
person Yasmin AM    schedule 23.09.2020
comment
как разрешить # в URL? RelaxQueryChars=^{}|[]_# и я использую tomcat 8.5.27 - person Sundar G; 20.03.2021
comment
Попробуйте: # Итак, возможно, что-то вроде этого: RelaxQueryChars=[]|{}^\`# - person Yasmin AM; 24.03.2021