Django - проверка CSRF не удалась - PullRequest
23 голосов
/ 28 декабря 2010

Я получаю сообщение об ошибке проверки CSRF при попытке создать простую форму из руководства.Я провел небольшое исследование того, что на самом деле является проверкой CSRF, и, насколько мне известно, для ее использования вам понадобится один из этих тегов csrf_token в вашем html, но у меня его нет

Вот мой шаблон:

<form action="/testapp1/contact/" method="post">
    {{ form.as_p }}
    <input type="submit" value="Submit" />
</form>

Довольно просто, расположен по адресу contact.html

Вот мой urlconf: from django.conf.urls.defaults import *

urlpatterns=patterns('testapp1.views',
    (r'^$', 'index'),
    (r'^contact/$','contact')
)

Имя приложенияtestapp1.Когда я набираю свой URL (http://localhost:8000/testapp1/contact),, я правильно перехожу к форме. Затем, когда я отправляю форму, я получаю ошибку проверки.

Вот мое мнение, хотя я не думаю, что оно уместно:

def contact(request):
    if request.method == 'POST': # If the form has been submitted...
        form = ContactForm(request.POST) # A form bound to the POST data
        if form.is_valid(): # All validation rules pass
            subject = form.cleaned_data['subject']
            message = form.cleaned_data['message']
            sender = form.cleaned_data['sender']
            cc_myself = form.cleaned_data['cc_myself']
            recipients = ['info@example.com']
            if cc_myself:
                recipients.append(sender)
            print 'Sending Mail:'+subject+','+message+','+sender+','+recipients
            return HttpResponseRedirect('/thanks/') # Redirect after POST
    else:
        form = ContactForm() # An unbound form

    return render_to_response('contact.html', {
        'form': form,
    })

Ответы [ 3 ]

34 голосов
/ 28 декабря 2010

Исправление

1 . включите {% csrf_token %} внутри тег формы в шаблоне.

2 . если по какой-либо причине вы используете render_to_response в Django 1.3 и выше, замените его на функцию render . Заменить это:

# Don't use this on Django 1.3 and above
return render_to_response('contact.html', {'form': form})

С этим:

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

Функция render была введена в Django версии 1.3 - если вы используете древнюю версию , например 1.2 или ниже , вы должны использовать render_to_response с aa RequestContext:

# Deprecated since version 2.0
return render_to_response('contact.html', {'form': form},
                   context_instance=RequestContext(request))

Что такое защита CSRF и зачем мне это нужно?

Это атака, при которой враг может заставить ваших пользователей делать такие неприятные вещи, как перевод средств, изменение адреса электронной почты и т. Д .:

Подделка межсайтовых запросов (CSRF) - это атака, которая вынуждает конечного пользователя выполнять нежелательные действия в веб-приложении, в котором они в настоящий момент проходят проверку подлинности. CSRF-атаки специально направлены на запросы об изменении состояния, а не на кражу данных, поскольку злоумышленник не может увидеть ответ на поддельный запрос. С небольшой помощью социальной инженерии (такой как отправка ссылки по электронной почте или в чате) злоумышленник может заставить пользователей веб-приложения выполнить действия по выбору злоумышленника. Если жертва является обычным пользователем, успешная атака CSRF может заставить пользователя выполнять запросы на изменение состояния, такие как перевод средств, изменение адреса электронной почты и т. Д. Если жертва является учетной записью администратора, CSRF может поставить под угрозу все веб-приложение. Источник: Открытый проект безопасности веб-приложений

Даже если вы не заботитесь о подобных вещах, теперь приложение может расти, поэтому лучше всего сохранять защиту CSRF.

Разве защита CSRF не должна быть опциональной?

Это необязательно, но включено по умолчанию (промежуточное программное обеспечение CSRF включено по умолчанию). Вы можете отключить его:

  • для конкретного вида, украшая его декоратором csrf_excempt.
  • для каждого представления путем удаления промежуточного программного обеспечения CSRF из списка промежуточного программного обеспечения по адресу settings.py

Если вы отключите его для всей системы, вы можете включить его для определенного вида, украсив его декоратором csrf_protect.

3 голосов
/ 10 января 2013

views.py:

from django.shortcuts import render_to_response
from django.template import RequestContext

def my_view(request):
    return render_to_response('mytemplate.html', context_instance=RequestContext(request)) 

mytemlate.html:

<form action="/someurls/" method="POST">{% csrf_token %}
2 голосов
/ 17 июля 2012

Для Джанго 1.4

settings.py

MIDDLEWARE_CLASSES = (
...
'django.middleware.csrf.CsrfViewMiddleware',
)

view.py

from django.template.defaulttags import csrf_token
from django.shortcuts import render

@csrf_token
def home(request):
    """home page"""
    return render(request,
        'template.html',
            {}
    )

template.html

<form action="">
    {% csrf_token %}
....
</form>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...