我应该在我的django注销视图中使用@csrf_protect以及中间件

时间:2012-03-30 02:15:18

标签: django csrf

我有一个自定义注销视图。我添加了下面的装饰器

from django.views.decorators.cache import never_cache
from django.views.decorators.csrf import csrf_protect
from django.views.decorators.http import require_POST
from django.contrib.auth.views import logout_then_login

@csrf_protect
@require_POST
@never_cache
def logout(request):
    nxt=request.POST.get('next')
    print 'next=',nxt
    return logout_then_login(request, nxt)

在我的设置文件中,我有以下中间件类

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
)

由于此处包含CsrfViewMiddleware,我的视图是否真的需要@csrf_protect?如果我同时使用它们,是否会出现问题/冲突?

顺便说一下,当我检查django source时,我发现装饰器仅适用于登录视图,而不适用于任何注销,login_then_logout视图。为什么?

欢迎任何帮助

1 个答案:

答案 0 :(得分:5)

中间件为所有视图提供全面保护 - 添加装饰器是多余的。 Django文档建议在装饰器上使用中间件,因为它提供了更好的保护。

  

建议不要使用装饰器,因为如果忘记了   使用它,你将有一个安全漏洞。 '腰带和背带'   使用两者的策略很好,并且会产生最小的开销。

装饰器不用于您提到的视图,因为如果触发login_then_logout事件并且会话被销毁后对用户没有安全风险,则会有很少或没有通过CSRF劫持会话的风险。

您似乎对CSRF有很多疑问 - 我可能会建议您Django's CSRF documentationgeneral中的CSRF?