簡體   English   中英

Tomcat 8 無法使用“|”處理獲取請求在查詢參數中?

[英]Tomcat 8 is not able to handle get request with '|' in query parameters?

我正在使用 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

所有主要的 Tomcat 版本都引入了此行為:

  • Tomcat的7.0.73,8.0.39,8.5.7

要修復,請執行以下操作之一:


根據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 字符列表)的影響。

從 Tomcat 7.0.768.0.428.5.12開始,您可以定義屬性requestTargetAllow以允許禁止字符。

catalina.properties添加這一行

tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}

問題: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.

從 7.0.88 開始,大多數 tomcat 版本都會出現此問題。

解決方案:(Apache 團隊推薦):

Tomcat 提高了它們的安全性,不再允許在查詢字符串中使用原始方括號。 在請求中,我們有 [,](方括號),因此服務器不會處理請求。

在 server.xml (%TOMCAT_HOME%/conf) 下的標簽下添加relaxedQueryChars屬性:

<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這些特殊字符添加到relaxedQueryChars屬性中,逗號分隔如上。

自 Tomcat 8.5 起不推薦使用參數tomcat.util.http.parser.HttpParser.requestTargetAllowtomcat 官方文檔

您可以在連接器定義中使用relaxedQueryChars / relaxedPathChars字符來允許這些字符: tomcat 官方文檔

URI 編碼為 UTF-8,但 Tomcat 將它們解碼為 ISO-8859-1。 您需要編輯 server.xml 中的連接器設置並添加 URIEncoding="UTF-8" 屬性。

或在您的 application.properties 上編輯此參數

server.tomcat.uri-encoding=utf-8

逃離它。 管道符號是一種隨着時間的推移和瀏覽器之間的不同處理方式。 例如,Chrome 和 Firefox 在復制/粘貼 URL 時以不同的方式轉換帶有管道的 URL。 然而,似乎與 Tomcat 8.5 最兼容和最必要的是逃避它:

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

向 server.xml 添加“relaxedQueryChars”屬性對我有用:

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="443" URIEncoding="UTF-8" relaxedQueryChars="[]|{}^&#x5c;&#x60;&quot;&lt;&gt;"/>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM