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

41ik7eoe  于 2023-05-19  发布在  Go
关注(0)|答案(1)|浏览(202)

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

  1. Django现在是否要求所有POST表单都受到CSRF的保护?
    1.我需要做的就是添加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'时才调用它。我觉得这完全不对。我不应该在context_instance=RequestContext(request)进行POST时调用它吗?

pw9qyyiw

pw9qyyiw1#

POST应该用于敏感信息,比如密码,django需要用csrf_token来保护它; GET应该用于不需要保护的可标记内容,比如搜索。你做得对。

编辑

你不应该在context_instance=RequestContext(request)执行POST时调用它,你应该不管请求类型如何都调用它。你这样看:

  • POST吗?这意味着表单已提交。我们验证表单,如果表单正常,则将用户重定向到另一个页面,或者show the form again to the user, with the errors
  • GET吗?这意味着表单没有被提交,但其他的事情正在发生,我们不关心(一些引用链接或其他东西)。Show the form anyway

斜体显示的操作由最后一次返回完成,与if无关。

相关问题