spring-projects / spring-projects/spring-security
Security-related HTTP headers not written if response is committed during INCLUDE dispatch and RequestDispatcher is not obtained via HttpServletRequest object
Nobody has claimed this yet.
- Dominant language
- Java
- Stars
- 9.6k
- Forks
- 6.3k
- Avg merge
- 2d 11h
- Merged PRs (30d)
- 52
Description
Summary
In #5499 a bug was fixed which caused security-related headers to not appear in HTTP response if that response was commited during INCLUDE dispatch. The solution was to wrap both HttpServletRequest and RequestDispatcher object in order to intercept RequestDispatcher::include call. That fix doesn't work if RequestDispatcher is obtained via some other means than HttpServletRequest::getRequestDispatcher method.
In my particular case it's the SiteMesh 2.x servlet filter that obtains dispatcher via ServletContext::getRequestDispatcher and then calls include method on it. The returned dispatcher is unfortunately not a wrapper created by HeaderWriterFilter which means that no security headers are added to HTTP response.
Actual Behavior
Assuming that security-related headers are enabled in spring-security:
HeaderWriterFilteris invoked and both request and response objects are wrapped.- After that some 3rd party library calls
RequestDispatcher::includeon dispatcher obtained via some other means thanHttpServletRequest::getRequestDispatchermethod. - Response is flushed during that INCLUDE dispatch call.
This results in security-related headers not being added to HTTP response.
Expected Behavior
The way of obtaining RequestDispatcher object should not be a factor when adding security-related headers to response.
Configuration
Tomcat 8.5.34
SiteMesh 2.4.2
Spring-based web application which uses JSPs and decorates them using SiteMesh.
Version
5.1.2
Sample
Attached is a Zip file containing a simple Spring Boot application. Simply run the de.chschu.spring.security.gh6414.Application main class.
The response of http://localhost:8080/positive will have the headers, while http://localhost:8080/negative (which simply includes the other one) will not.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with HeaderWriterFilter and its wrapping of HttpServletRequest, HttpServletResponse, and RequestDispatcher; compare the HttpServletRequest and ServletContext dispatcher paths described in the report. Run the supplied sample by starting de.chschu.spring.security.gh6414.Application and compare headers on /positive and /negative. Done means security-related headers are present when the included response is flushed regardless of how the dispatcher was obtained.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java, spring
- Domain
- backend, security
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100