Django CSRF framework не может быть отключена и нарушает мой сайт
промежуточное программное обеспечение django csrf не может быть отключено. Я прокомментировал это из своего промежуточного программного обеспечения моего проекта, но мои логины не работают из-за отсутствующих проблем CSRF. Я работаю из багажника Джанго. Как CSRF может вызвать проблемы, если он не включен в middleware?
Я должен отключить его, потому что на моем сайте есть много запросов на публикацию, которые CSRF просто ломает. Любые отзывы о том, как я могу полностью отключить CSRF в проекте Django trunk?
"новая" структура CSRF из ствола Django также ломается внешний сайт, который входит и делает сообщение на URL, который я им даю (это часть restful API.) Я не могу отключить фреймворк CSRF, как я уже говорил ранее, как я могу это исправить?
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™.