Pregunta

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 de CSRF que faltan. Estoy trabajando desde el baúl de Django. ¿Cómo puede CSRF causar problemas si no está habilitado en middleware?

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

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

¿Fue útil?

Solución

Vea las respuestas a continuación para obtener una mejor solución. Desde que escribí esto, mucho ha cambiado. Ahora hay mejores formas de desactivar CSRF.

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

De todos modos, para solucionarlo, simplemente lo comenté y dejé 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.")

Otros consejos

Sí, el marco Django csrf se puede deshabilitar.

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

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 otras cosas sin cambios si no lo ha incluido en sus formularios.

Puede deshabilitar esto en middleware.

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

MIDDLEWARE_CLASSES = (

    myapp.disable.DisableCSRF, 

)

Cree un disable.py en myapp con lo siguiente

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

Básicamente, si configura _dont_enforce_csrf_checks en su solicitud, debería estar bien.

En general, no debería deshabilitar la protección CSRF, ya que hacerlo abre agujeros de seguridad. Si insistes, sin embargo ...

Una nueva forma de hacer la protección CSRF aterrizó en el tronco recientemente. ¿Su sitio por casualidad todavía está configurado para hacerlo a la antigua? Aquí están los documentos de The New Way ™ y aquí están los < a href = "http://docs.djangoproject.com/en/dev/ref/contrib/csrf/#legacy-method" rel = "noreferrer"> documentos para The Old Way ™ .

Simplemente intenté eliminar las referencias a las clases de middleware csrf de mi settings.py, funcionó. No estoy seguro si esto es aceptable. ¿Algún comentario? A continuación se eliminaron dos líneas:

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

mi versión de 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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top