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.

However, above URL works in Tomcat 8.0.39.

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
/mde/



Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to