diff --git a/docs/manual/src/docbook/web-infrastructure.xml b/docs/manual/src/docbook/web-infrastructure.xml index 61d86199cb..0cdb546cb8 100644 --- a/docs/manual/src/docbook/web-infrastructure.xml +++ b/docs/manual/src/docbook/web-infrastructure.xml @@ -192,7 +192,7 @@
- Request Matching + Request Matching and <interfacename>HttpFirewall</interfacename> Spring Security has several areas where patterns you have defined are tested against incoming requests in order to decide how the request should be handled. This occurs when the FilterChainProxy decides which filter chain a @@ -206,30 +206,51 @@ contextPath, servletPath, pathInfo and queryString. Spring Security is only interested in securing paths within the application, so the - contextPath is ignored. Each path segment of a URL may contain - parameters, as defined in RFC - 2396 + contextPath is ignored. Unfortunately, the servlet spec does not + define exactly what the values of servletPath and + pathInfo will contain for a particular request URI. For example, + each path segment of a URL may contain parameters, as defined in RFC 2396 You have probably seen this when a browser doesn't support cookies and the jsessionid parameter is appended to the URL after a semi-colon. However the RFC allows the presence of these parameters in any path segment of the URL . The Specification does not clearly state whether these should be - included in the servletPath and pathInfo value - and the behaviour varies between different servlet containers. There is a danger - that when an application is deployed in a container which does not strip path + included in the servletPath and pathInfo + values and the behaviour varies between different servlet containers. There is a + danger that when an application is deployed in a container which does not strip path parameters from these values, an attacker could add them to the requested URL in - order to cause a pattern match to succeed or fail unexpectedly. Spring Security's - FilterChainProxy therefore wraps incoming requests to - consistently return servletPath and pathInfo - values which do not contain path parameters. For example, an original request path - /secure;hack=1/somefile.html;hack=2 will be returned as - /secure/somefile.html. It is therefore essential that a - FilterChainProxy is used to manage the security filter - chain. + order to cause a pattern match to succeed or fail unexpectedly. + The original values will be returned once the request leaves the + FilterChainProxy, so will still be available to the + application. + . Other variations in the incoming URL are also possible. For example, it + could contain path-traversal sequences (like /../) or multiple + forward slashes (//) which could also cause pattern-matches to + fail. Some containers normalize these out before performing the servlet mapping, but + others don't. To protect against issues like these, + FilterChainProxy uses an + HttpFirewall strategy to check and wrap the request. + Un-normalized requests are automatically rejected by default, and path parameters + and duplicate slashes are removed for matching purposes. + So, for example, an original request path + /secure;hack=1/somefile.html;hack=2 will be returned as + /secure/somefile.html. + . It is therefore essential that a + FilterChainProxy is used to manage the security filter chain. + Note that the servletPath and pathInfo values + are decoded by the container, so your application should not have any valid paths + which contain semi-colons, as these parts will be removed for matching purposes. As mentioned above, the default strategy is to use Ant-style paths for matching - and this is likely to be the best choice for most users. Matching is performed - a pattern against the concatenated servletPath and - pathInfo, ignoring the queryString, and is case insensitive by default. + and this is likely to be the best choice for most users. The strategy is implemented + in the class AntPathRequestMatcher which uses Spring's + AntPathMatcher to perform a case-insensitive match of the + pattern against the concatenated servletPath and + pathInfo, ignoring the queryString. + If for some reason, you need a more powerful matching strategy, you can use + regular expressions. The strategy implementation is then + RegexRequestMatcher. See the Javadoc for this class for more + information. In practice we recommend that you use method security at your service layer, to control access to your application, and do not rely entirely on the use of security constraints defined at the web-application level. URLs change and it is difficult to