Django:POST 表单需要 CSRF? GET 没有?

Posted

技术标签:

【中文标题】Django:POST 表单需要 CSRF? GET 没有?【英文标题】:Django: POST form requires CSRF? GET doesn't? 【发布时间】:2011-04-03 23:21:22 【问题描述】:

使用 POST 方法的表单是否需要具有 CSRF 保护?我正在关注一本书,代码示例会引发 403 错误。我做了一些搜索,似乎我需要在所有表单中启用 CSRF。

我的问题是:

    Django 现在是否要求所有 POST 表单都受到 CSRF 保护?

    我需要做的就是添加 'django.middleware.csrf.CsrfViewMiddleware',返回 render_to_response(template,dictionary,context_instance=RequestContext(request),然后添加 '% csrf_token %'对应的表格?我这里有什么遗漏吗?

当我这样做时,表单工作正常。当这些部分中的任何一个丢失时,它都会失败 403。我只是想确保我做对了。 :)

提前致谢。

编辑:

由于某种原因,这段代码对我来说没有意义,但它不会返回任何错误。请忽略原始验证,因为我还没有到达本书中显示更有效方法的部分。

def contact(request):
    errors = []

    if request.method == 'POST':
        if not request.POST.get('subject',''):
            errors.append('Enter a subject')
        if not request.POST.get('message',''):
            errors.append('Enter a message')
        if request.POST.get('email', '') and '@' not in request.POST['email']:
            errors.append('Enter a valid email address')
        if not errors:
            send_mail(
                request.POST['subject'],
                request.POST['message'],
                request.POST.get('email', 'noreply@example.com'), ['siteownder@example.com'],)
            return HttpResponseRedirect('/contact/thanks/')

    return render_to_response('contact_form.html',  'errors': errors , context_instance=RequestContext(request))

我的问题是这个视图函数的最后一行。只有在 request.method != POST 时才会调用它。这对我来说似乎完全错误。我不应该在执行 POST 时调用“context_instance=RequestContext(request)”吗?

【问题讨论】:

【参考方案1】:

POST 应该用于敏感信息,例如密码,django 需要使用 csrf_token 保护它; GET 应该用于不需要保护的可收藏的内容,例如搜索。你做对了。

编辑

当它执行POST 时,您不应该调用context_instance=RequestContext(request),无论请求类型如何,您都应该调用它。像这样看:

POST吗?这意味着表单已提交。我们验证表单,如果表单正常,则将用户重定向到另一个页面,或者再次向用户显示表单,但出现错误。 是GET吗?这意味着表单没有提交,但是我们不关心的其他事情正在发生(一些推荐链接或其他事情)。 仍然显示表单

斜体的动作是在最后一次返回时完成的,与 if 无关。

【讨论】:

以上是关于Django:POST 表单需要 CSRF? GET 没有?的主要内容,如果未能解决你的问题,请参考以下文章

Django POST 请求失败

django1.11如何用post方法提交表单

Django在以post的方式提交表单时报错CSRF verification failed. Request aborted的解决办法

django中form表单post无法提交

Django 表单中的 CSRF 令牌丢失或不正确

django种表单post出现CSRF verification failed( CSRF验证失败 ) 的两种解决方案