【问题标题】:Django caching causes CSRF violationsDjango缓存导致CSRF违规
【发布时间】:2015-06-30 16:40:14
【问题描述】:

我的网站使用 django-registration 进行登录/注册。最近我介绍了一些缓存中间件,它在尝试进行背靠背新用户注册时导致 CSRF 违规。

这是我的 settings.py 中的中间件声明:

MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.cache.UpdateCacheMiddleware',          <------
'django.middleware.locale.LocaleMiddleware',
'linaro_django_pagination.middleware.PaginationMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',       <------
'djangobb_forum.middleware.LastLoginMiddleware',
'djangobb_forum.middleware.UsersOnline',
'djangobb_forum.middleware.TimezoneMiddleware',

)

不确定这是否是一个真正的问题。中间件语句的顺序重要吗?

看来 CSRF 和 Cache 中间件必须有办法共存。目前我删除了缓存中间件。

【问题讨论】:

    标签: django caching csrf


    【解决方案1】:

    根据https://docs.djangoproject.com/en/1.8/topics/cache/#the-per-site-cache

    设置缓存后,使用缓存的最简单方法是缓存整个网站。您需要将 'django.middleware.cache.UpdateCacheMiddleware' 和 'django.middleware.cache.FetchFromCacheMiddleware' 添加到 MIDDLEWARE_CLASSES 设置中,如下例所示:

    MIDDLEWARE_CLASSES = (
        'django.middleware.cache.UpdateCacheMiddleware',
        'django.middleware.common.CommonMiddleware',
        'django.middleware.cache.FetchFromCacheMiddleware',
    )
    

    注意

    不,这不是错字:“更新”中间件必须在列表中的第一个,“获取”中间件必须在最后。细节有点模糊,但请参阅顺序MIDDLEWARE_CLASSES 如果您想要完整的故事,请在下方查看。

    但不确定这是否有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-06
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多