Наличие POST'able API и промежуточного программного обеспечения Django CSRF - PullRequest
32 голосов
/ 09 марта 2010

У меня есть веб-приложение Django, которое имеет как интерфейсный, веб-доступный компонент, так и API, к которому обращается клиент настольного компьютера. Однако теперь, с новым компонентом промежуточного программного обеспечения CSRF, запросы API от клиента рабочего стола, которые отправляются POST, получают 403.

Я понимаю, почему это происходит, но как правильно это исправить, не ставя под угрозу безопасность? Есть ли какой-нибудь способ сообщить в заголовке HTTP, что это запрос API и что Django не должен проверять CSRF или это плохая стратегия?

Edit -

Метод, который я сейчас использую, заключается в том, что клиент рабочего стола устанавливает заголовок X-Requested-With: XMLHttpRequest. Это немного странно, но я не уверен, как с этим лучше справиться.

Ответы [ 3 ]

10 голосов
/ 09 марта 2010

Как насчет того, чтобы просто отделить представления для вашего настольного клиента и украсить их с помощью csrf_exempt ?

8 голосов
/ 17 января 2013

Если вы используете представление на основе классов, вам потребуется csrf_exempt метод отправки, а не метод post, например:

@method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs):
    return super(MyView, self).dispatch(request, *args, **kwargs)

См. Этот билет ошибки: https://code.djangoproject.com/ticket/15794

0 голосов
/ 06 сентября 2010

Начиная с Django 1.1, код CSRF автоматически пропускает запросы AJAX, так как браузеры, кажется, выполняют надлежащие проверки безопасности. Вот оригинальный коммит и документация .

...