|
18 | 18 | from django.core import management |
19 | 19 | from django.core.cache import (cache, caches, CacheKeyWarning, |
20 | 20 | InvalidCacheBackendError, DEFAULT_CACHE_ALIAS) |
| 21 | +from django.core.context_processors import csrf |
21 | 22 | from django.db import connection, router, transaction |
22 | 23 | from django.core.cache.utils import make_template_fragment_key |
23 | 24 | from django.http import HttpResponse, StreamingHttpResponse |
24 | 25 | from django.middleware.cache import (FetchFromCacheMiddleware, |
25 | 26 | UpdateCacheMiddleware, CacheMiddleware) |
| 27 | +from django.middleware.csrf import CsrfViewMiddleware |
26 | 28 | from django.template import Template |
27 | 29 | from django.template.response import TemplateResponse |
28 | 30 | from django.test import TestCase, TransactionTestCase, RequestFactory, override_settings |
@@ -1739,6 +1741,10 @@ def hello_world_view(request, value): |
1739 | 1741 | return HttpResponse('Hello World %s' % value) |
1740 | 1742 |
|
1741 | 1743 |
|
| 1744 | +def csrf_view(request): |
| 1745 | + return HttpResponse(csrf(request)['csrf_token']) |
| 1746 | + |
| 1747 | + |
1742 | 1748 | @override_settings( |
1743 | 1749 | CACHE_MIDDLEWARE_ALIAS='other', |
1744 | 1750 | CACHE_MIDDLEWARE_KEY_PREFIX='middlewareprefix', |
@@ -1958,6 +1964,27 @@ def test_view_decorator(self): |
1958 | 1964 | response = other_with_prefix_view(request, '16') |
1959 | 1965 | self.assertEqual(response.content, b'Hello World 16') |
1960 | 1966 |
|
| 1967 | + def test_sensitive_cookie_not_cached(self): |
| 1968 | + """ |
| 1969 | + Django must prevent caching of responses that set a user-specific (and |
| 1970 | + maybe security sensitive) cookie in response to a cookie-less request. |
| 1971 | + """ |
| 1972 | + csrf_middleware = CsrfViewMiddleware() |
| 1973 | + cache_middleware = CacheMiddleware() |
| 1974 | + |
| 1975 | + request = self.factory.get('/view/') |
| 1976 | + self.assertIsNone(cache_middleware.process_request(request)) |
| 1977 | + |
| 1978 | + csrf_middleware.process_view(request, csrf_view, (), {}) |
| 1979 | + |
| 1980 | + response = csrf_view(request) |
| 1981 | + |
| 1982 | + response = csrf_middleware.process_response(request, response) |
| 1983 | + response = cache_middleware.process_response(request, response) |
| 1984 | + |
| 1985 | + # Inserting a CSRF cookie in a cookie-less request prevented caching. |
| 1986 | + self.assertIsNone(cache_middleware.process_request(request)) |
| 1987 | + |
1961 | 1988 |
|
1962 | 1989 | @override_settings( |
1963 | 1990 | CACHE_MIDDLEWARE_KEY_PREFIX='settingsprefix', |
|
0 commit comments