form django csrf

form - El framework Django CSRF no se puede deshabilitar y está rompiendo mi sitio



csrf form django (6)

El middleware django csrf no se puede deshabilitar. Lo he comentado desde mi Middleware de mi proyecto, pero mis inicios de sesión están fallando debido a problemas con CSRF. Estoy trabajando desde el baúl de Django. ¿Cómo puede CSRF causar problemas si no está habilitado en middleware?

Tengo que desactivarlo porque hay muchas solicitudes POST en mi sitio que simplemente CSRF rompe. ¿Algún comentario sobre cómo puedo deshabilitar por completo CSRF en un proyecto troncal django?

El "nuevo" marco CSRF del tronco de Django también está rompiendo un sitio externo que está entrando y haciendo un POST en una URL que les estoy dando (esto es parte de una API relajante). No puedo deshabilitar el marco CSRF como Dije antes, ¿cómo puedo solucionar esto?


En general, no debe deshabilitar la protección CSRF, ya que al hacerlo se abren agujeros de seguridad. Si insistes, sin embargo ...

Una nueva forma de hacer la protección CSRF aterrizó en trunk recientemente. ¿Su sitio está por casualidad configurado para hacerlo a la antigua? Aquí están los documentos para The New Way ™ y aquí están los documentos para The Old Way ™ .


Puedes deshabilitar esto en middleware.

En su settings.py agregue una línea a MIDDLEWARE_CLASSES:

MIDDLEWARE_CLASSES = ( myapp.disable.DisableCSRF, )

Crea un disable.py en myapp con el siguiente

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

Básicamente, si configuras _dont_enforce_csrf_checks en tu solicitud, deberías estar bien.


Sí, el framework Django csrf puede ser deshabilitado.

Para excluir manualmente que una función de vista no sea manejada por ningún middleware CSRF, puede usar el decorador csrf_exempt, que se encuentra en el módulo django.views.decorators.csrf. Por ejemplo: ( ver doc )

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

... y luego elimine {% csrf_token %} dentro de los formularios de su plantilla, o deje los demás sin cambios si no los ha incluido en sus formularios.


Simplemente intenté eliminar las referencias a las clases de csrf middleware de mi settings.py, funcionó. No estoy seguro si esto es aceptable. ¿Algún comentario? Debajo de dos líneas fueron removidas -

''django.middleware.csrf.CsrfViewMiddleware'', ''django.middleware.csrf.CsrfResponseMiddleware'',


mi versión django es 1.11. el middleware debería ser así:

from django.utils.deprecation import MiddlewareMixin class DisableCSRF(MiddlewareMixin): def process_request(self, request): setattr(request, ''_dont_enforce_csrf_checks'', True)


Vea las respuestas debajo de esto para una mejor solución. Desde que escribí esto, muchas cosas han cambiado. Ahora hay mejores formas de desactivar CSRF.

Siento tu dolor. No es aceptable que un marco modifique dicha funcionalidad fundamental. Incluso si quiero comenzar a usar esto a partir de ahora, tengo sitios heredados en la misma máquina que comparten una copia de django. Cambios como este deberían requerir revisiones de números de versión mayores. 1.x -> 2.x.

De todos modos, para solucionarlo acabo de comentarlo y he dejado de actualizar Django con tanta frecuencia.

Archivo: django / middleware / csrf.py Alrededor de la línea 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.")