返回文章列表文章索引阅读全文
STARBLOG / 阅读手记
0_Django开发常见问题

CSRF-verification-failed-Request-aborted

About the CSRF_Token (From Django Official Document) The CSRF middleware and template tag provides easy-to-use protection against Cross Site Request Forgeries. This type of attack occurs when a malici

曦远 (DealiAxy)约 9 分钟
目录4 个章节

About the CSRF_Token

(From Django Official Document)

The CSRF middleware and template tag provides easy-to-use protection against Cross Site Request Forgeries. This type of attack occurs when a malicious website contains a link, a form button or some JavaScript that is intended to perform some action on your website, using the credentials of a logged-in user who visits the malicious site in their browser. A related type of attack, ‘login CSRF’, where an attacking site tricks a user’s browser into logging into a site with someone else’s credentials, is also covered.

The first defense against CSRF attacks is to ensure that GET requests (and other ‘safe’ methods, as defined by RFC 7231#section-4.2.1) are side effect free. Requests via ‘unsafe’ methods, such as POST, PUT, and DELETE, can then be protected by following the steps below.

The error

According to the official documentation, I only needed to add csrf_token to forms that submit via POST. Even so, I still ran into this problem. I went through the docs a few more times, found nothing wrong, then searched on Google and discovered it was a template-rendering issue. The book I was reading recently, 16 Lessons of Django, really led me astray. Following its approach caused all sorts of problems—what a trap.

Solution

The original approach was to first get a template object with the get_template function, then render it into HTML. That’s exactly where the problem was: HTML rendered this way does not include the csrf_token! Using django.shortcuts.render as described in the official documentation does not have this problem.

Official code, while I’m at it

views.py

from django.shortcuts import render
from django.http import HttpResponseRedirect

from .forms import NameForm

def get_name(request):
    # if this is a POST request we need to process the form data
    if request.method == 'POST':
        # create a form instance and populate it with data from the request:
        form = NameForm(request.POST)
        # check whether it's valid:
        if form.is_valid():
            # process the data in form.cleaned_data as required
            # ...
            # redirect to a new URL:
            return HttpResponseRedirect('/thanks/')

    # if a GET (or any other method) we'll create a blank form
    else:
        form = NameForm()

    return render(request, 'name.html', {'form': form})

name.html

<form action="/your-name/" method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit" />
</form>

Also attaching the official explanation of Cross Site Request Forgery protection Forms and Cross Site Request Forgery protection

Django ships with an easy-to-use protection against Cross Site Request Forgeries. When submitting a form via POST with CSRF protection enabled you must use the csrf_token template tag as in the preceding example. However, since CSRF protection is not directly tied to forms in templates, this tag is omitted from the following examples in this document.

_EOF_

CSRF-verification-failed-Request-aborted

本文作者:
程序设计实验室
版权声明:
本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

相关文章

讨论

共 0 条

良言一句三冬暖,恶语伤人六月寒。

加载评论中…