Подтвердить что ты не робот

Наличие POST'able API и промежуточного ПО Django CSRF

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

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

Edit -

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

4b9b3361

Ответ 1

Как просто расщепить представление для вашего настольного клиента и украсить их csrf_exempt?

Ответ 2

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

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

Смотрите этот биг-лист: https://code.djangoproject.com/ticket/15794

Ответ 3

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