Django:POST 表单需要 CSRF? GET 不是吗?

问题描述 投票:0回答:1

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

我的问题是:

  1. Django 现在是否要求保护所有 POST 表单免受 CSRF 攻击?

  2. 我需要做的就是添加

    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', '[email protected]'),
                ['[email protected]'],
            )
            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)
吗?

django view django-csrf
1个回答
15
投票

POST应该用于敏感信息,比如密码,django需要用csrf_token来保护它; GET 应该用于不需要保护的可添加书签的东西,比如搜索。你做对了。

编辑

你不应该在它做

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

  • POST
    吗?这意味着表单已提交。我们验证表单,如果表单没问题,将用户重定向到另一个页面,或者再次向用户显示表单,并显示错误.
  • GET
    吗?这意味着表单没有提交,但是我们不关心的其他事情正在发生(一些推荐链接或其他东西)。 无论如何都要显示表格

斜体的动作是由最后一次返回完成的,不管 if.

© www.soinside.com 2019 - 2024. All rights reserved.