Opened 3 weeks ago
Last modified 8 days ago
#37280 assigned New feature
ContentSecurityPolicyMiddleware should set Cache-Control: Private if a nonce is rendered
| Reported by: | Jacob Walls | Owned by: | Shubham Akhilesh Singh |
|---|---|---|---|
| Component: | Core (Cache system) | Version: | dev |
| Severity: | Normal | Keywords: | csp nonce |
| Cc: | Johannes Maron, Tim Schilling, Rob Hudson | Triage Stage: | Accepted |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | yes |
| Easy pickings: | no | UI/UX: | no |
Description
If a CSP nonce is rendered into a response, the response is no longer suitable for caching. See discussion at MDN issue tracker and our docs:
Avoid caching full responses that include {{ csp_nonce }} or csp_nonce_attr.
We can make it easier for pages cached with the UpdateCacheMiddleware to do the secure thing by default by having the ContentSecurityPolicyMiddleware set Cache-Control: Private if a nonce has been rendered.
Then, for this case:
If caching is necessary, use a strategy that injects a fresh nonce on each request
Johannes mused about an opt-out mechanism for folks who have done exactly that -- injected a fresh nonce somehow -- e.g. with a class attribute on the middleware to keep the Django 6.0 status quo.
Then, for the per-page cache, It's a known flaw that @cache_page runs before middlewares have had a chance to set interesting headers (#15855). So the above won't help. We could simply mention CSP nonces in the same paragraph added in 4ef959ab0c7dde0459041a795359c9bc040df2b7, unless we think it's redundant.
Change History (5)
comment:1 by , 3 weeks ago
| Type: | Cleanup/optimization → New feature |
|---|
comment:2 by , 3 weeks ago
| Triage Stage: | Unreviewed → Accepted |
|---|
comment:3 by , 12 days ago
| Owner: | changed from to |
|---|
comment:4 by , 12 days ago
| Has patch: | set |
|---|
comment:5 by , 8 days ago
| Patch needs improvement: | set |
|---|
Worth a release note