2015-08-06 1 views
1

На моем сайте есть одна страница с двумя формами и 3 вызовами POST на основе ajax. Я использовал csrf_token в одной из форм. Кроме того, чтобы быть в состоянии выполнить CSRF безопасных вызовов Ajax, я использую руководящие принципы размещены на официальной документации: https://docs.djangoproject.com/en/1.7/ref/contrib/csrf/ и этот блог: https://realpython.com/blog/python/django-and-ajax-form-submissions/django: csrf_token для нескольких форм и запросов ajax на одной странице

Как было предложен, с помощью этого peice кода https://gist.github.com/broinjc/db6e0ac214c355c887e5 в моем файле JavaScript, то кажется, что я могу выполнять запросы POST без каких-либо проблем.

Вопросы:

  1. Пользуется csrf_token в одной из форм, наряду с яваскрипта кода (как упоминалось выше) достаточно, чтобы обеспечить CSRF подделку? Должен ли я использовать csrf_token во второй форме?
  2. Как и было предложено в этом сообщении SO Generating CSRF tokens for multiple forms on a single page кажется, что использовать тот же токен должно быть хорошо. Однако, чтобы быть ясным, я использую {% csrf_token %} в своей первой форме, а не в скрытом поле, как упоминалось в сообщении. И я не использую csrf_token в своей второй форме.
  3. Должен ли я делать что-нибудь дополнительное для моих аякс-звонков или они в порядке?
  4. Есть ли способ проверить в views.py функцию, что звонок csrf безопасен?

Сообщите мне, если вам нужна дополнительная информация, и я буду рад продолжить разработку.

ответ

2

Использует csrf_token в одной из форм вместе с кодом javascript (упомянутым выше), достаточным для обеспечения подделки csrf? Должен ли я быть , используя csrf_token во второй форме?

Я надеюсь, что нет;) Включения CsrfViewMiddleware в Django достаточно, чтобы гарантировать, что ваши взгляды защищены против запроса межсайтового подлога. Если вы используете две отдельные формы HTML (два тега <form></form>), обе формы должны иметь скрытое поле токена CSRF. Если вы используете две формы Django в одном теге form, вам понадобится только один раз.

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

Как было предложено в этом SO размещает Генерирующую CSRF токены для нескольких форм на одной странице кажется, используя тот же маркер должен быть штрафом. Однако, чтобы быть ясным, я использую {% csrf_token%} в своей первой форме , а не в скрытом поле, как упоминалось в сообщении. И я не , используя любой csrf_token в моей второй форме.

{% csrf_token %} тег создает скрытое поле для вас, так что по существу вы являются с использованием скрытого поля.

Должен ли я делать что-либо дополнительно для своих вызовов ajax или они в порядке?

Включенный javascript задает заголовок значению токена CSRF для каждого запроса AJAX. Этот заголовок заменяет почтовые данные, которые обычно отправляются скрытым полем в форме. Любые вызовы AJAX, которые вы отправляете через jQuery, будут иметь этот заголовок, вам не нужно ничего делать.

Есть ли способ проверить в функции views.py, что вызов является безопасным csrf?

Не совсем. Пока у вас включен CsrfViewMiddleware, и вы не используете декоратор csrf_exempt, ваш вид защищен. Если вызов небезопасен, промежуточное программное обеспечение вернет ответ 403 Forbidden, прежде чем запрос даже достигнет представления.