Структура 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)