Kaydet (Commit) 22e8ab02 authored tarafından Michal Čihař's avatar Michal Čihař Kaydeden (comit) Tim Graham

Fixed #29728 -- Prevented session resaving if CSRF cookie is unchanged.

üst f315d042
...@@ -181,7 +181,8 @@ class CsrfViewMiddleware(MiddlewareMixin): ...@@ -181,7 +181,8 @@ class CsrfViewMiddleware(MiddlewareMixin):
def _set_token(self, request, response): def _set_token(self, request, response):
if settings.CSRF_USE_SESSIONS: if settings.CSRF_USE_SESSIONS:
request.session[CSRF_SESSION_KEY] = request.META['CSRF_COOKIE'] if request.session.get(CSRF_SESSION_KEY) != request.META['CSRF_COOKIE']:
request.session[CSRF_SESSION_KEY] = request.META['CSRF_COOKIE']
else: else:
response.set_cookie( response.set_cookie(
settings.CSRF_COOKIE_NAME, settings.CSRF_COOKIE_NAME,
......
import re import re
from django.conf import settings from django.conf import settings
from django.contrib.sessions.backends.cache import SessionStore
from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ImproperlyConfigured
from django.http import HttpRequest from django.http import HttpRequest
from django.middleware.csrf import ( from django.middleware.csrf import (
...@@ -24,8 +25,7 @@ class TestingHttpRequest(HttpRequest): ...@@ -24,8 +25,7 @@ class TestingHttpRequest(HttpRequest):
""" """
def __init__(self): def __init__(self):
super().__init__() super().__init__()
# A real session backend isn't needed. self.session = SessionStore()
self.session = {}
def is_secure(self): def is_secure(self):
return getattr(self, '_is_secure_override', False) return getattr(self, '_is_secure_override', False)
...@@ -693,6 +693,19 @@ class CsrfViewMiddlewareUseSessionsTests(CsrfViewMiddlewareTestMixin, SimpleTest ...@@ -693,6 +693,19 @@ class CsrfViewMiddlewareUseSessionsTests(CsrfViewMiddlewareTestMixin, SimpleTest
ensure_csrf_cookie_view(req) ensure_csrf_cookie_view(req)
self.assertTrue(req.session.get(CSRF_SESSION_KEY, False)) self.assertTrue(req.session.get(CSRF_SESSION_KEY, False))
def test_session_modify(self):
"""The session isn't saved if the CSRF cookie is unchanged."""
req = self._get_GET_no_csrf_cookie_request()
self.mw.process_view(req, ensure_csrf_cookie_view, (), {})
resp = ensure_csrf_cookie_view(req)
self.mw.process_response(req, resp)
self.assertIsNotNone(req.session.get(CSRF_SESSION_KEY))
req.session.modified = False
self.mw.process_view(req, ensure_csrf_cookie_view, (), {})
resp = ensure_csrf_cookie_view(req)
self.mw.process_response(req, resp)
self.assertFalse(req.session.modified)
def test_ensures_csrf_cookie_with_middleware(self): def test_ensures_csrf_cookie_with_middleware(self):
""" """
The ensure_csrf_cookie() decorator works with the CsrfViewMiddleware The ensure_csrf_cookie() decorator works with the CsrfViewMiddleware
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment