web-dev-qa-db-fra.com

Django CSRF framework ne peut pas être désactivé et est en train de casser mon site

Le middleware Django csrf ne peut pas être désactivé. Je l'ai commenté à partir du middleware de mon projet, mais mes connexions échouent en raison de problèmes CSRF manquants. Je travaille depuis le coffre de Django. Comment le CSRF peut-il causer des problèmes s'il n'est pas activé dans les middlewares?

Je dois le désactiver car il y a beaucoup de POST demandes sur mon site que CSRF rompt simplement. Des commentaires sur la façon dont je peux complètement désactiver CSRF dans un projet de junk Djunk?

Le "nouveau" framework CSRF du coffre de Django coud également un site externe qui entre et effectue un POST sur une URL que je leur donne (cela fait partie d'une API reposante.) Je ne peux pas désactiver le cadre CSRF comme je l'ai dit plus tôt, comment puis-je résoudre ce problème?

55
MikeN

Voir les réponses ci-dessous pour une meilleure solution. Depuis que j'ai écrit ceci, beaucoup de choses ont changé. Il existe maintenant de meilleurs moyens de désactiver CSRF.

Je ressens ta douleur. Il n'est pas acceptable qu'un framework modifie des fonctionnalités aussi fondamentales. Même si je veux commencer à utiliser ceci à partir de maintenant, j'ai des sites hérités sur la même machine partageant une copie de Django. Des modifications comme celles-ci devraient nécessiter des révisions majeures du numéro de version. 1.x -> 2.x. 

Quoi qu'il en soit, pour résoudre ce problème, j'ai juste commenté et arrêté de mettre Django à jour aussi souvent.

Fichier: Django/middleware/csrf.py Autour de la ligne 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
Aaron

Oui, le framework Django csrf peut être désactivé.

Pour exclure manuellement une fonction d'affichage du traitement de tout middleware CSRF, vous pouvez utiliser le décorateur csrf_exempt, situé dans le module Django.views.decorators.csrf. Par exemple: ( voir doc )

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

..et supprimez ensuite {% csrf_token %} des formulaires de votre modèle, ou laissez les autres éléments inchangés si vous ne les avez pas inclus dans vos formulaires.

125
Adriot

Vous pouvez désactiver ceci dans le middleware.

Dans votre fichier settings.py, ajoutez une ligne à MIDDLEWARE_CLASSES:

MIDDLEWARE_CLASSES = (

    myapp.disable.DisableCSRF, 

)

Créez un fichier disable.py dans myapp avec les éléments suivants

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

Fondamentalement, si vous définissez les _dont_enforce_csrf_checks dans votre demande, vous devriez être ok.

82
shreddd

En général, vous ne devriez pas désactiver la protection CSRF, car cela ouvre des failles de sécurité. Si vous insistez cependant…

Une nouvelle manière de protéger la CSRF a atterri dans le coffre récemment. Est-ce que votre site par hasard est toujours configuré pour le faire à l'ancienne? Voici les documents pour The New Way ™ et voici les docs pour The Old Way ™ .

6
Hank Gay

J'ai simplement essayé de supprimer les références aux classes de middleware csrf de mon settings.py, cela a fonctionné Pas sûr que ce soit acceptable. Avez-vous des commentaires? Au-dessous de deux lignes ont été supprimées - 

      'Django.middleware.csrf.CsrfViewMiddleware',
      'Django.middleware.csrf.CsrfResponseMiddleware',
4
Yateen

ma version de Django est la 1.11. le middleware devrait être comme ça:

from Django.utils.deprecation import MiddlewareMixin


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