注销时 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 验证失败的主要内容,如果未能解决你的问题,请参考以下文章

Django 1.2.4 CSRF 验证失败

管理面板的 Django CSRF 验证失败

错误:“CSRF 验证失败。请求中止。”在 Django 中使用 jquery ajax 时

django CSRF 验证失败。请求中止

CSRF 验证失败。请求中止。在 django 上

iPhone POST 到 Django 并获得 CSRF 验证失败