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


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

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

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

6 54

6 ответов:

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

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

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

File: 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.")

да, Django csrf framework можно отключить.

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

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

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

вы можете отключить это в middleware.

в вашем 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 в своем запросе, вы должны быть в порядке.

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

новый способ защиты CSRF приземлился в багажнике совсем недавно. Ваш сайт случайно все еще настроен на то, чтобы сделать это по-старому? Вот такие документы для нового пути™ и вот это docs for the Old Way™.

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

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

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

from django.utils.deprecation import MiddlewareMixin


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