On 17/11/2016 21:29, Mark Eggers wrote:
> Mark,
> 
> 
> On 11/17/2016 2:00 AM, Mark Thomas wrote:
>> On 16/11/2016 20:05, Mark Eggers wrote:
>>> Mark,
>>>
>>> On 11/16/2016 12:23 AM, Mark Thomas wrote:
>>>> On 15/11/2016 22:36, Zdeněk Henek wrote:
>>>>> Hi,
>>>>>
>>>>> we are using tomcat 8.0.30 without problems.
>>>>>
>>>>> I have tested upgrade to 8.0.38 today and I got this error
>>>>> More env. details JDK 8, tested on both Linux and Windows using different
>>>>> JDK 8 updates (71, 111).
>>>>>
>>>>> 15-Nov-2016 17:14:51.189 INFO [http-nio-8080-exec-2]
>>>>> org.apache.coyote.http11.AbstractHttp11Processor.process 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
>>>>
>>>> <snip/>
>>>>
>>>>> The parameter in the request is this
>>>>>
>>>>> /list?criteria={%22$type%22:%22Equal%22,%22attr%22:%22id%22,%22value%22:101}
>>>>
>>>> Neither '{' nor '}' are permitted characters in a URI and that includes
>>>> the query string.
>>>>
>>>>> Looks like this commit caused the exception
>>>>> https://github.com/apache/tomcat80/commit/779d5d34e68e50d2f721897050b147106992f566
>>>>>
>>>>> The commit message says:
>>>>> Add additional checks for valid characters to the HTTP request line
>>>>> parsing so invalid request lines are rejected sooner.
>>>>>
>>>>> We don't get any error in 8.0.30 using same request.
>>>>>
>>>>> The state in 8.0.30 was bug or 8.0.38 should process parameter
>>>>>
>>>>> criteria={%22$type%22:%22Equal%22,%22attr%22:%22id%22,%22value%22:101}
>>>>>
>>>>> ?
>>>>
>>>> Technically, 8.0.30 should have rejected the request but didn't.
>>>>
>>>> As per the commit message, Tomcat has tightened up validation of
>>>> incoming HTTP requests to reject any that are not specification compliant.
>>>>
>>>> For the query string, the relevant extracts from RFC 3986 are:
>>>>
>>>> query       = *( pchar / "/" / "?" )
>>>>
>>>> pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
>>>>
>>>> unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
>>>>
>>>> sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
>>>>               / "*" / "+" / "," / ";" / "="
>>>>
>>>>
>>>> Hence, '{' and '}' are rejected.
>>>>
>>>> Mark
>>>
>>> Based on your explanation above, shouldn't the following query parameter
>>> be rejected?
>>>
>>> http://somehost/someurl?plist=tagA=valueA|tagB=valueB|tagC=valueC
>>>
>>> where tagA, tagB, tagC, valueA, valueB, valueC are all ALPHA or DIGIT.
>>>
>>> I didn't see "|" listed as acceptable anywhere in RFC 3986.
>>
>> I agree, such a request should be rejected.
>>
>>> However, above URL works in Tomcat 8.0.39.
>>
>> I've just tested 9.0.x and 8.0.x and both rejected it. I don't think
>> there have been any changes since those releases. Are you sure that:
>> a) you are using 8.0.39
>> b) the client isn't encoding the '|' before it is sent to Tomcat
>>
>>> I ask this because a developer has used the pipe symbol to separate
>>> components. It plays havoc with mod_security rules, among other things.
>>>
>>> . . . a bit puzzled
>>
>> Me too. Any light you can shed would be helpful.
> 
> I did a Wireshark capture. The client is not encoding '|' before
> sending. The '=' is not being encoded either.
> 
> I figured it out. I have Apache 2.2 (on Linux) or Apache 2.4 (on
> Windows) in front of Tomcat.
> 
> I connect the two using mod_jk. When going through the following:
> 
> browser --> apache httpd (2.2, 2.4) -->(AJP) Tomcat (8.0.39, 8.5.8)
> 
> the request works ('|', '=', and other hideousness).
> 
> When going through the following:
> 
> browser --> Tomcat (8.0.39, 8.5.8)
> 
> the request fails with the error message as posted by the original author.
> 
> I'll go through the Apache HTTPD and mod_jk configurations carefully to
> see what's going on.
> 
> However, both are pretty stock configurations.

The AJP checks are much less rigorous since it is assumed that the
front-end server will validate the data before forwarding. It looks like
httpd isn't as strict as Tomcat in this case.

Mark


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to