2010-08-25 8 views
5

Формы, которые используют метод POST, необходимый для защиты CSRF? Я следую за книгой, а примеры кода бросают 403 ошибки. Я сделал некоторые поиски, и кажется, что мне нужно включить CSRF во всех моих формах.Django: Форма POST требует CSRF? GET нет?

Мои вопросы:

  1. ли Django теперь требуют, чтобы все формы POST быть защищен от CSRF?

  2. Все, что мне нужно сделать, чтобы выполнить это добавить 'django.middleware.csrf.CsrfViewMiddleware', обратный render_to_response (шаблон, словарь, context_instance = RequestContext (запрос), и добавить '{% csrf_token%}' в соответствующая форма? Я пропускаю что-нибудь здесь?

Когда я делаю это, форма работает отлично. Если какой-либо из этих частей не хватает, он не 403. Я просто хочу, чтобы убедиться, что я это делаю RIGHT. :)

Заранее спасибо.

редактировать:

По какой-то причине этот код не имеет смысла для меня, но это не возвращать какие-либо ошибки. Пожалуйста, игнорируйте примитивную проверку, поскольку я не попал в раздел книги, где он показывает более эффективный способ сделать это еще.

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. Это кажется мне совершенно неправильным. Не следует ли мне называть «context_instance = RequestContext (request)», когда он выполняет POST?

ответ

7

POST должен использоваться для получения конфиденциальной информации, такой как пароли, и django требует обеспечения ее csrf_token; GET следует использовать для закладок, которые не нужно защищать, например, поисковые запросы. Вы делаете это правильно.

EDIT

Вы не должны называть context_instance=RequestContext(request), когда это делает POST, вы должны называть его, независимо от типа запроса. Посмотрите на это вот так:

  • Это POST? это означает, что форма была представлена. мы проверяем форму и перенаправляем пользователя на другую страницу, если форма в порядке, или снова отображает форму пользователю, с ошибками.
  • Это GET? это означает, что форма не была отправлена, но происходит другое дело, которое нам не волнует (какая-то ссылка для реферера или другое). Показать форму в любом случае

Действия, выделенные курсивом, делаются последнего возвращения, независимо от того, если.

Смежные вопросы