Каркас Django CSRF не может быть отключен и нарушает мой сайт - PullRequest
55 голосов
/ 30 октября 2009

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

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

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

Ответы [ 6 ]

125 голосов
/ 08 июля 2010

Да, фреймворк 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 %} внутри форм из вашего шаблона или оставьте другие вещи без изменений, если вы не включили его в свои формы.

82 голосов
/ 08 января 2011

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

В вашем файле settings.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 в своем запросе, все будет в порядке.

11 голосов
/ 12 марта 2010

См. Ответы ниже для лучшего решения. С тех пор как я написал это, многое изменилось. Теперь есть лучшие способы отключить 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.")
6 голосов
/ 30 октября 2009

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

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

4 голосов
/ 13 ноября 2010

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

      'django.middleware.csrf.CsrfViewMiddleware',
      'django.middleware.csrf.CsrfResponseMiddleware',
0 голосов
/ 24 октября 2017

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

from django.utils.deprecation import MiddlewareMixin


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