Tomcat 8 n'est pas capable de gérer la requête get avec '|' dans les paramètres de requête?

J'utilise Tomcat 8. Dans un cas, j'ai besoin de traiter une requête externe provenant d'une source externe où la requête a un paramètre où elle est séparée par |.

Demande ressemble à ceci:

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

Dans ce cas je suis d'erreur suivant.

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

il fonctionne avec Apache Tomcat 8.0.30 mais pas avec Tomcat 8.5

34
demandé sur jordiburgos 2016-12-09 08:27:28

6 réponses

ce comportement est introduit dans toutes les versions majeures de Tomcat:

  • Tomcat 7.0.73, 8.0.39,8.5.7

pour une correction rapide, vous pouvez passer à l'une des versions plus anciennes ou Définir requestTargetAllow ( voir la réponse de Jérémie).

basé sur changelog, ces changements pourraient influer sur ce comportement:

Tomcat 8.5.3:

s'Assurer que les demandes avec la méthode HTTP, Les Noms qui ne sont pas des jetons (comme requis par la RFC 7231) sont rejetés avec une réponse de 400

Tomcat 8.5.7:

ajouter des vérifications supplémentaires pour les caractères valides à la ligne de requête HTTP, afin que les lignes de requête invalides soient rejetées plus tôt.


mais finalement vous voulez encoder votre URL sur client:

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

ou tout simplement de la chaîne de requête:

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

il vous protégera des autres problématique caractères ( liste des caractères URI invalides).

39
répondu Piotr Lewandowski 2017-06-07 22:10:30

Depuis Tomcat 7.0.76,8.0.42,8.5.12 vous pouvez définir la propriété requestTargetAllow pour autoriser les caractères forbiden.

Ajouter cette ligne dans votre catalina.properties

tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
39
répondu Jérémie Lesage 2017-06-08 01:20:39

y Échapper. Le symbole pipe est un symbole qui a été manipulé différemment au fil du temps et entre les navigateurs. Par exemple, Chrome et Firefox convertissent une URL avec pipe différemment lorsqu'ils les copient/collent. Cependant, le plus compatible, et nécessaire avec Tomcat 8.5 il semble, est d'échapper à ça:

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

3
répondu Dan Armstrong 2016-12-10 10:33:33

L'URI est codé en UTF-8, mais Tomcat les décode EN ISO-8859-1. Vous devez modifier les paramètres du connecteur du serveur.xml et ajouter L'attribut URIEncoding="UTF-8".

ou éditez ce paramètre sur votre application.propriétés

le serveur.tomcat.uri-encoding=utf-8

2
répondu Omid Nazerizadeh 2017-09-05 10:51:08

Le paramètre tomcat.util.http.parser.HttpParser.requestTargetAllow est déprécié depuis Tomcat 8.5: tomcat officiel doc.

Vous pouvez utiliser relaxedQueryChars / relaxedPathChars dans la définition des connecteurs pour permettre à ces caractères:tomcat officiel doc.

2
répondu Lincoln 2018-07-06 14:33:48

nous avons trouvé le même problème . Après avoir analysé la question , trouvé la solution . Voici les détails de la question et de la solution.

Problème: Tomcat (7.0.88) lance l'exception ci – dessous qui mène à 400-Bad Request. Java.lang.IllegalArgumentException: caractère invalide trouvé dans la cible de la requête. Les caractères valides sont définis dans les RFC 7230 et 3986. Ce problème se pose dans la plupart des versions de tomcat à partir du 7.0.88.

Solution: (suggérée par Apache de l'équipe):

Tomcat a augmenté leur sécurité et n'autorise plus les crochets bruts dans la chaîne de requête. Dans la requête nous avons [,] (crochets) donc la requête de l'hôtel n'est pas traitée par le serveur.

Comme solution ci-dessous sont les étapes doivent être intégrées pour faire fonctionner comme prévu. 1. Nous avons besoin d'ajouter l'attribut relaxedQueryChars sous la balise sous 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="[,]"
             />
  1. si l'application nécessite plus de caractères spéciaux qui sont non pris en charge par tomcat par défaut, nous avons besoin d'ajouter ces caractères spéciaux dans l'attribut relaxedQueryChars avec la virgule séparée comme ci-dessus.
1
répondu rama krishna chinna reddy 2018-08-21 13:20:34