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

dam*_*mon 5 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)
Run Code Online (Sandbox Code Playgroud)

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

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
)
Run Code Online (Sandbox Code Playgroud)

由于CsrfViewMiddleware包含在这里,我真的需要@csrf_protect用于我的视图吗?如果我同时使用它们,会有一些问题/冲突吗?

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

欢迎任何帮助

Tod*_*odd 5

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

不推荐使用装饰器,因为如果忘记使用装饰器,则会出现安全漏洞.使用两者的"腰带和括号"策略很好,并且会产生最小的开销.

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

你似乎有很多关于CSRF的问题-也许,我建议你多练练就Django的CSRF文档中和CSRF 一般