web-dev-qa-db-fra.com

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, je dois gérer une requête externe provenant d'une source externe dans laquelle la requête a des paramètres où elle est séparée par |.

La demande ressemble à ceci:

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

Dans ce cas, je reçois l'erreur suivante.

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

Cela fonctionne avec Apache Tomcat 8.0.30 mais pas avec Tomcat 8.5

52
ashishjmeshram

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

  • Tomcat 7.0.73 , 8.0.39 , 8.5.7

Pour résoudre ce problème, effectuez l’une des opérations suivantes:


Basé sur changelog , ces modifications pourraient affecter ce comportement:

Tomcat 8.5.3:

Assurez-vous que les demandes avec des noms de méthode HTTP qui ne sont pas des jetons (comme requis par la RFC 7231) sont rejetées avec une réponse 400

Tomcat 8.5.7:

Ajoutez des vérifications supplémentaires pour les caractères valides à l'analyse de la ligne de requête HTTP afin que les lignes de requête non valides soient rejetées plus tôt.


La meilleure option (suivant la norme) - vous voulez encoder votre URL sur le client:

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

ou simplement la chaîne de requête:

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

Cela vous protégera des autres caractères problématiques ( liste des caractères d'URI non valides ).

57
Piotr Lewandowski

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

Ajouter cette ligne dans votre catalina.properties

Tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
47
Jérémie Lesage

Problème: Tomcat (7.0.88) émet une exception ci-dessous, qui conduit à 400 - Bad Request.

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

Ce problème se produit dans la plupart des versions de Tomcat à partir de la version 7.0.88.

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

Tomcat a renforcé leur sécurité et n'autorise plus les crochets bruts dans la chaîne de requête. Dans la requête, nous avons [] (crochets), de sorte que la requête n’est pas traitée par le serveur.

Ajoutez 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="[,]"
             />

Si l'application nécessite davantage de caractères spéciaux qui ne sont pas pris en charge par Tomcat par défaut, ajoutez ces caractères spéciaux dans l'attribut relaxedQueryChars, séparés par une virgule comme ci-dessus.

11

Le paramètre Tomcat.util.http.parser.HttpParser.requestTargetAllow est obsolète depuis Tomcat 8.5: documentation officielle de Tomcat .

Vous pouvez utiliser relaxedQueryChars / relaxedPathChars dans la définition des connecteurs pour autoriser les caractères suivants: documentation officielle de Tomcat .

11
Lincoln

L'URI est codé au format UTF-8, mais Tomcat les décode au format ISO-8859-1. Vous devez modifier les paramètres du connecteur dans le fichier server.xml et ajouter l'attribut URIEncoding = "UTF-8".

ou éditez ce paramètre sur votre application.properties

server.Tomcat.uri-encoding = utf-8

5
Omid Nazerizadeh

Échapper. Le symbole de pipe est un symbole qui a été géré différemment dans le temps et entre les navigateurs. Par exemple, Chrome et Firefox convertissent différemment une URL avec un tuyau lors de leur copier/coller. Cependant, le plus compatible et nécessaire avec Tomcat 8.5 semble être de lui échapper:

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

4
Dan Armstrong