Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC

前言:

      公司一個在WinServer中運行的很穩定的Web項目遷移到Linux上。並且Web容器版本從tomcat-6.0.41升級到tomcat-7.0.81。遷移後進行測試,在點擊某一個頁面的時候出現了Http:400的錯誤。

Oct 26, 2017 2:15:30 AM org.apache.coyote.http11.AbstractHttp11Processor process
INFO: Error parsing HTTP request header
 Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.
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.InternalInputBuffer.parseRequestLine(InternalInputBuffer.java:189)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1028)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:745)

解決過程:

      經過排查,是訪問頁面的url中含有字符“|”,導致這個問題。原因如下:

      查詢資料得知,tomcat-7.0.73, 8.0.39, 8.5.7 版本後增加了對請求的校驗。

      RFC3986文檔規定,Url中只允許包含英文字母(a-zA-Z)、數字(0-9)、-_.~4個特殊字符以及所有保留字符。

      RFC3986中指定了以下字符爲保留字符:

!*'();:@&=+$,/?#[]

      還有一些字符,當他們直接放在Url中的時候,可能會引起解析程序的歧義。這些字符被視爲不安全字符,原因有很多。

->空格Url在傳輸的過程,或者用戶在排版的過程,或者文本處理程序在處理Url的過程,都有可能引入無關緊要的空格,或者將那些有意義的空格給去掉

->引號以及<>引號和尖括號通常用於在普通文本中起到分隔Url的作用

->#通常用於表示書籤或者錨點

->%百分號本身用作對不安全字符進行編碼時使用的特殊字符,因此本身需要編碼

->{}|\^[]`~某一些網關或者傳輸代理會篡改這些字符

故,該錯誤是由於請求中url參數“違法”造成的。

解決辦法:

① 降低tomcat版本(本文未採用);

② 對tomcat的http請求進行特殊字符過濾:


配置tomcat的catalina.properties(路徑:tomcat/config)

添加或者修改:

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

當然還有另外一種方法,就是將所有的參數都進行編碼



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章