168 votes

Comment désactiver la validation CSRF de Django ?

J'ai commenté les lignes du processeur csrf et du middleware dans le fichier settings.py :

122 
123 TEMPLATE_CONTEXT_PROCESSORS = (
124     'django.contrib.auth.context_processors.auth',
125 #    'django.core.context_processors.csrf',
126     'django.core.context_processors.request',
127     'django.core.context_processors.static',
128     'cyathea.processors.static',
129 )
130 
131 MIDDLEWARE_CLASSES = (
132     'django.middleware.common.CommonMiddleware',
133     'django.contrib.sessions.middleware.SessionMiddleware',
134 #    'django.middleware.csrf.CsrfViewMiddleware',
135     'django.contrib.auth.middleware.AuthenticationMiddleware',
136     'django.contrib.messages.middleware.MessageMiddleware',
137     'django.middleware.locale.LocaleMiddleware',
138     # Uncomment the next line for simple clickjacking protection:
139     # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
140 )

Mais lorsque j'utilise Ajax pour envoyer une requête, Django répond toujours 'csrf token is incorrect or missing', et après avoir ajouté X-CSRFToken aux en-têtes, la requête aboutit.

Qu'est-ce qui se passe ici ?

13voto

naren Points 1378

La réponse peut être inappropriée, mais j'espère qu'elle vous aidera.

class DisableCSRFOnDebug(object):
    def process_request(self, request):
        if settings.DEBUG:
            setattr(request, '_dont_enforce_csrf_checks', True)

Ce type d'intergiciel permet de déboguer les demandes et de vérifier le csrf dans les serveurs de production.

9voto

JJP Points 567

Si vous voulez le désactiver dans Global, vous pouvez écrire un middleware personnalisé, comme ceci

from django.utils.deprecation import MiddlewareMixin

class DisableCsrfCheck(MiddlewareMixin):

    def process_request(self, req):
        attr = '_dont_enforce_csrf_checks'
        if not getattr(req, attr, False):
            setattr(req, attr, True)

puis ajoutez cette classe youappname.middlewarefilename.DisableCsrfCheck a MIDDLEWARE_CLASSES listes, avant django.middleware.csrf.CsrfViewMiddleware

5voto

Saeed Points 1540

Avant d'utiliser cette solution, veuillez lire ce lien de la documentation


J'ai résolu ce problème en suivant les deux étapes suivantes :

  1. Ajouter cette classe à un utils.py fichier :

    from <your-project-name> import settings
    class DisableCSRF(MiddlewareMixin):
       def process_request(self, request):
          if settings.DEBUG:
             setattr(request, '_dont_enforce_csrf_checks', True)
  2. Et dans le settings.py ajoutez l'intergiciel ci-dessus au fichier MIDDLEWARE liste :

    ...
    MIDDLEWARE = [
        ...
        'django.middleware.csrf.CsrfViewMiddleware',
        ...
        '<path-of-utils.py>.utils.DisableCSRF',
    ]
    ...

1voto

s29 Points 452

CSRF peut être mis en œuvre au niveau de la vue, qui ne peut pas être désactivé globalement .

Dans certains cas, cela est pénible, mais "c'est pour la sécurité". Il faut conserver ces notes AAA.

https://docs.djangoproject.com/en/dev/ref/csrf/#contrib-and-reusable-apps

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X