|
19 | 19 | from django.core.cache import get_cache
|
20 | 20 | from django.core.cache.backends.base import (CacheKeyWarning,
|
21 | 21 | InvalidCacheBackendError)
|
| 22 | +from django.core.context_processors import csrf |
22 | 23 | from django.db import router, transaction
|
23 | 24 | from django.core.cache.utils import make_template_fragment_key
|
24 | 25 | from django.http import (HttpResponse, HttpRequest, StreamingHttpResponse,
|
25 | 26 | QueryDict)
|
26 | 27 | from django.middleware.cache import (FetchFromCacheMiddleware,
|
27 | 28 | UpdateCacheMiddleware, CacheMiddleware)
|
| 29 | +from django.middleware.csrf import CsrfViewMiddleware |
28 | 30 | from django.template import Template
|
29 | 31 | from django.template.response import TemplateResponse
|
30 | 32 | from django.test import TestCase, TransactionTestCase, RequestFactory
|
@@ -1578,6 +1580,10 @@ def hello_world_view(request, value):
|
1578 | 1580 | return HttpResponse('Hello World %s' % value)
|
1579 | 1581 |
|
1580 | 1582 |
|
| 1583 | +def csrf_view(request): |
| 1584 | + return HttpResponse(csrf(request)['csrf_token']) |
| 1585 | + |
| 1586 | + |
1581 | 1587 | @override_settings(
|
1582 | 1588 | CACHE_MIDDLEWARE_ALIAS='other',
|
1583 | 1589 | CACHE_MIDDLEWARE_KEY_PREFIX='middlewareprefix',
|
@@ -1797,6 +1803,28 @@ def test_view_decorator(self):
|
1797 | 1803 | response = other_with_prefix_view(request, '16')
|
1798 | 1804 | self.assertEqual(response.content, b'Hello World 16')
|
1799 | 1805 |
|
| 1806 | + def test_sensitive_cookie_not_cached(self): |
| 1807 | + """ |
| 1808 | + Django must prevent caching of responses that set a user-specific (and |
| 1809 | + maybe security sensitive) cookie in response to a cookie-less request. |
| 1810 | + """ |
| 1811 | + csrf_middleware = CsrfViewMiddleware() |
| 1812 | + cache_middleware = CacheMiddleware() |
| 1813 | + |
| 1814 | + request = self.factory.get('/view/') |
| 1815 | + self.assertIsNone(cache_middleware.process_request(request)) |
| 1816 | + |
| 1817 | + csrf_middleware.process_view(request, csrf_view, (), {}) |
| 1818 | + |
| 1819 | + response = csrf_view(request) |
| 1820 | + |
| 1821 | + response = csrf_middleware.process_response(request, response) |
| 1822 | + response = cache_middleware.process_response(request, response) |
| 1823 | + |
| 1824 | + # Inserting a CSRF cookie in a cookie-less request prevented caching. |
| 1825 | + self.assertIsNone(cache_middleware.process_request(request)) |
| 1826 | + |
| 1827 | + |
1800 | 1828 | @override_settings(
|
1801 | 1829 | CACHE_MIDDLEWARE_KEY_PREFIX='settingsprefix',
|
1802 | 1830 | CACHE_MIDDLEWARE_SECONDS=1,
|
|
0 commit comments