Django CSRF framework nie może być wyłączony i niszczy moją stronę

Nie można wyłączyć oprogramowania pośredniczącego django csrf. Skomentowałem to z oprogramowania pośredniego mojego projektu, ale moje loginy nie działają z powodu brakujących problemów z CSRF. Pracuję z bagażnika Django. Jak CSRF może powodować problemy, jeśli nie jest włączony w middleware?

Muszę go wyłączyć, ponieważ na mojej stronie jest wiele żądań postów, które CSRF po prostu psuje. Jakieś uwagi na temat tego, jak mogę całkowicie wyłączyć CSRF w projekcie trunk django?

"nowy" framework CSRF z Django trunk łamie również zewnętrzną stronę, która wchodzi i robi POST na podanym przeze mnie adresie URL (jest to część restful API.) Nie mogę wyłączyć CSRF framework jak powiedziałem wcześniej, Jak mogę to naprawić?

 54
Author: MikeN, 2009-10-30

6 answers

Zobacz Odpowiedzi poniżej, aby uzyskać lepsze rozwiązanie. Odkąd to napisałem, wiele się zmieniło. Istnieją teraz lepsze sposoby wyłączenia CSRF.

Czuję twój ból. To niedopuszczalne, aby framework zmieniał tak podstawową funkcjonalność. Nawet jeśli chcę zacząć używać tego od teraz, mam starsze strony na tej samej maszynie dzielące się kopią django. Takie zmiany powinny wymagać większych zmian w numerach wersji. 1.x -- > 2.x.

W każdym razie, aby to naprawić, skomentowałem to i przestałem aktualizować Django tak często.

Plik: django/middleware/csrf.py Wokół linii 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.")
 11
Author: Aaron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-26 12:58:22

Tak, Django csrf framework może być wyłączony.

Aby ręcznie wykluczyć funkcję widoku z obsługi dowolnego oprogramowania pośredniczącego CSRF, możesz użyć dekoratora csrf_exempt, znalezionego w django.widoki.dekoratorów.moduł csrf. Na przykład: (Zobacz doc)

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

..a następnie usuń {% csrf_token %} wewnątrz formularzy z szablonu lub pozostaw inne rzeczy bez zmian, jeśli nie uwzględniłeś ich w formularzach.

 125
Author: Adriot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-15 08:14:34

Możesz to wyłączyć w middleware.

W Twoim settings.py Dodaj wiersz do MIDDLEWARE_CLASSES:

MIDDLEWARE_CLASSES = (

    myapp.disable.DisableCSRF, 

)

Create a disable.py w myapp z następującym

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

Zasadniczo jeśli ustawisz _dont_enforce_csrf_checks w żądaniu, powinno być ok.

 82
Author: shreddd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-08 00:44:10

Ogólnie rzecz biorąc, nie powinieneś wyłączać ochrony CSRF, ponieważ otwiera to luki w zabezpieczeniach. Jeśli jednak nalegasz ...

Nowy sposób wykonywania ochrony CSRF wylądował niedawno w bagażniku. Czy Twoja strona jest przypadkiem nadal skonfigurowana tak, aby robić to w stary sposób? Oto docs for the New Way™ oraz docs for the Old Way™.

 6
Author: Hank Gay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-30 16:45:51

Po prostu próbowałem usunąć odniesienia do klas middleware csrf z mojego settings.py zadziałało. Nie wiem, czy jest to dopuszczalne. Jakieś uwagi? Poniżej usunięto dwie linie -

      'django.middleware.csrf.CsrfViewMiddleware',
      'django.middleware.csrf.CsrfResponseMiddleware',
 4
Author: Yateen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-13 11:23:32

Moja wersja django to 1.11. middleware powinno wyglądać tak:

from django.utils.deprecation import MiddlewareMixin


class DisableCSRF(MiddlewareMixin):
    def process_request(self, request):
        setattr(request, '_dont_enforce_csrf_checks', True)
 0
Author: blackholll,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-24 10:19:49