If you run this simple RestController with Spring Boot (2.5.3):
@RestController
public class SampleRestController {
@GetMapping("/search/{criteria}")
public String hello(@PathVariable(name = "criteria") String criteria) {
return "Hello: " + criteria;
}
}
And try to open this link in your browser:
http://localhost:8080/search/%22%5C%22bug%5C%22%22
Then you will get "400 Bad Request", returned by the embedded Tomcat.
I don't understand, is this a bug in Tomcat ? Is this not a valid URL ?
EDIT: As per some of the replies: I went step-by-step through the Tomcat 9.0.50 source-code and saw the line about ALLOW_BACKSLASH.
And neither of the values true or false is good for me, because with true it replaced \
with /
and with false it returns 400 Bad Request.
What I needed was to allow backslash without replacing it with slash.
My question is really whether this is a bug in Tomcat, since for me the URL seems to be valid. I am not technically putting a \
into the URL, I am putting a %-encoded backslash. What is the purpose of the %-encoding if not to allow the user to send any character in the URL ?
While samabcde's answer provides a solution for your problem, let me answer to your more general questions:
/
, %2F
and %5C
were used to split the request URI into components. If Tomcat was behind a proxy that forwarded only an application (let's say /app
), you could use /app/%5C../manager/html
to access Tomcat Manager.If you set org.apache.catalina.connector.CoyoteAdapter.ALLOW_BACKSLASH=true
you expose your system to the aforementioned vulnerability and all %5C
sequences will appear as /
in the servletPath
and pathInfo
ServletRequest
properties. Since the requestURI
property contains the undecoded URI path (cf. this question) your example will work.