Opened 48 minutes ago

Last modified 39 minutes ago

#37280 assigned New feature

ContentSecurityPolicyMiddleware should set Cache-Control: Private if a nonce is rendered

Reported by: Jacob Walls Owned by: Django Sprints
Component: Core (Cache system) Version: dev
Severity: Normal Keywords: csp nonce
Cc: Johannes Maron, Tim Schilling, Rob Hudson Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
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 (1)

comment:1 by Jacob Walls, 39 minutes ago

Type: Cleanup/optimizationNew feature

Worth a release note

Note: See TracTickets for help on using tickets.
Back to Top