Структура Django CSRF не может быть отключена и нарушает мой сайт

Средство django csrf не может быть отключено. Я прокомментировал это из своего Middleware моего проекта, но мои логины терпят неудачу из-за отсутствия проблем CSRF. Я работаю из ствола Django. Как CSRF может вызывать проблемы, если он не включен в промежуточном программном обеспечении?

Мне нужно отключить его, потому что на моем сайте есть много запросов POST, которые CSRF просто ломает. Любая обратная связь о том, как я могу полностью отключить CSRF в проекте магистрали django?

"Новая" CSRF-инфраструктура из магистрали Django также нарушает внешний сайт, который приходит и делает POST по URL-адресу, который я им даю (это часть ненадежного API.) Я не могу отключить CSRF, как я сказал ранее, как я могу это исправить?

Ответ 1

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

Я чувствую твою боль. Это не приемлемо для рамки, чтобы изменить такую ​​фундаментальную функциональность. Даже если я хочу начать использовать это с этого момента, у меня есть устаревшие сайты на том же компьютере, где есть копия django. Изменения, подобные этому, требуют пересмотра номера версии. 1.x → 2.x.

В любом случае, чтобы исправить это, я просто прокомментировал это и прекратил обновление Django так часто.

Файл: django/middleware/csrf.py По линии 160:

            # check incoming token
#            request_csrf_token = request.POST.get('csrfmiddlewaretoken', None)
#            if request_csrf_token != csrf_token:
#                if cookie_is_new:
#                    # probably a problem setting the CSRF cookie
#                    return reject("CSRF cookie not set.")
#                else:
#                    return reject("CSRF token missing or incorrect.")

Ответ 2

Да, инфраструктура Django csrf может быть отключена.

Чтобы вручную исключить функцию просмотра из любого промежуточного программного обеспечения CSRF, вы можете использовать декоратор csrf_exempt, расположенный в модуле django.views.decorators.csrf. Например: (см. Документ)

from django.views.decorators.csrf import csrf_exempt                                          
@csrf_exempt                                                                                  
def my_view:                                                                            
    return Httpresponse("hello world")

.. и затем удалите {% csrf_token %} внутри форм из вашего шаблона или оставите другие вещи без изменений, если вы не включили их в свои формы.

Ответ 3

Вы можете отключить это в промежуточном программном обеспечении.

В ваших настройках .py добавьте строку в MIDDLEWARE_CLASSES:

MIDDLEWARE_CLASSES = (

    myapp.disable.DisableCSRF, 

)

Создайте disable.py в myapp со следующими

class DisableCSRF(object):
    def process_request(self, request):
        setattr(request, '_dont_enforce_csrf_checks', True)

В принципе, если вы задали _dont_enforce_csrf_checks в своем запросе, вы должны быть в порядке.

Ответ 4

В общем, вы не должны отключать защиту CSRF, так как это открывает дыры в безопасности. Если вы настаиваете, хотя...

Новый способ защиты CSRF недавно появился в багажнике. Ваш сайт случайно настроен на то, чтобы сделать это по-старому? Вот документы для The New Way & trade; и вот docs для The Старый путь и торговля;.

Ответ 5

Я просто попытался удалить ссылки на классы промежуточного программного обеспечения csrf из моих настроек .py, он сработал. Не уверен, что это приемлемо. Любые комментарии? Ниже были удалены две строки -

      'django.middleware.csrf.CsrfViewMiddleware',
      'django.middleware.csrf.CsrfResponseMiddleware',

Ответ 6

моя версия django - 1.11. промежуточное ПО должно выглядеть следующим образом:

from django.utils.deprecation import MiddlewareMixin


class DisableCSRF(MiddlewareMixin):
    def process_request(self, request):
        setattr(request, '_dont_enforce_csrf_checks', True)