我有一个自定义注销视图。我添加了下面的装饰器
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视图。为什么?
欢迎任何帮助
答案 0 :(得分:5)
中间件为所有视图提供全面保护 - 添加装饰器是多余的。 Django文档建议在装饰器上使用中间件,因为它提供了更好的保护。
建议不要使用装饰器,因为如果忘记了 使用它,你将有一个安全漏洞。 '腰带和背带' 使用两者的策略很好,并且会产生最小的开销。
装饰器不用于您提到的视图,因为如果触发login_then_logout事件并且会话被销毁后对用户没有安全风险,则会有很少或没有通过CSRF劫持会话的风险。
您似乎对CSRF有很多疑问 - 我可能会建议您Django's CSRF documentation和general中的CSRF?