注销时 Django CSRF 验证失败
Posted
技术标签:
【中文标题】注销时 Django CSRF 验证失败【英文标题】:Django CSRF verification failed while logout 【发布时间】:2013-09-23 09:01:58 【问题描述】:CSRF
有问题。我尝试使用自定义简单视图注销用户。
首先,main.html
(我开始了,所以很简单)
<div id="user">
<form id="login_form" method="post" action="logout/">
% csrf_token %
<p>Witaj user.first_name!</p>
<input type="submit" class="login_button" name="logout" value="Wyloguj"/>
</form>
</div>
urls.py
url(r'^main/logout/$',views.flogout, name='flogout'),
views.py
def flogout(request):
logout(request)
return HttpResponseRedirect("/index/")
我收到 403 Forbidden - CSRF 验证失败。请求中止。
【问题讨论】:
% csrf_token %
标签是否在 html 中正确呈现?也不应该有action="/main/logout/"
吗?
我使用该标签的方式与登录时相同,并且在那里工作正常。 action="logout/" 没问题
【参考方案1】:
注销,应该只是一个链接,不需要表单。我会这样做:
URLS.PY
url(r'^logout', views.logout), # Adding a '$' at the end of the url means that you cannot add any get parameters.
VIEWS.PY
from django.contrib.auth import logout as auth_logout
def logout(request):
auth_logout(request)
return HttpResponseRedirect("/index/")
简单的添加注销视图的链接就足够了,不需要表单或CSRF
。
【讨论】:
我真的建议使用 csrf 令牌进行注销(或者至少使用 POST 而不是 GET)。否则,当您打开任何带有来自http://yourdomain/logout
的图像的站点时,您将被注销。这可以用作 DOS 攻击,使您的“会员区”无法使用(如果注销图像加载到登录后站点 FE 中),但也可以用于帮助进行网络钓鱼攻击并简单地惹恼用户。【参考方案2】:
当您遇到“403 Forbidden - CSRF 验证失败。请求中止”时,请查看以下清单。错误:
检查 settings.py 文件中的 MIDDLEWARE_CLASSES 元组是否具有以下中间件: 'django.middleware.csrf.CsrfViewMiddleware'
检查元素内是否有 % csrf_token % 标签。 *请注意,这仅适用于表单转到内部 URL 的情况。
检查 settings.py 文件中的 TEMPLATE_CONTEXT_PROCESSORS 元组是否有这个中间件:'django.core.context_processors.csrf'
检查您是否在您的 views.py 文件中导入了以下行“from django.shortcuts import render_to_response”。在函数中,您必须像这样将 render_to_response 与 RequestContext 一起使用:
return render_to_response('main.html', context_instance=RequestContext(request))
您的错误在views.py 中。你不应该'return HttpResponseRedirect',而应该使用'return render_to_response'。
【讨论】:
以上是关于注销时 Django CSRF 验证失败的主要内容,如果未能解决你的问题,请参考以下文章