2010-03-08 8 views
31

Tengo una aplicación web Django que tiene tanto un componente front-end accesible a través de la web como una API a la que accede un cliente de escritorio. Sin embargo, ahora con el nuevo componente de middleware CSRF, las solicitudes API del cliente de escritorio que tienen POST reciben un 403.Tener una API POST'able y el middleware CSRF de Django

Entiendo por qué ocurre esto, pero ¿cuál es la manera correcta de solucionarlo sin comprometer la seguridad? ¿Hay alguna forma en que pueda indicar en el encabezado HTTP que se trata de una solicitud de API y que Django no debería estar buscando CSRF o es una mala estrategia?

Edit--

El método que estoy usando en este momento es que el cliente de escritorio establece un encabezado, X-solicitada-Con: XMLHttpRequest. Esto es un poco hacky, pero no estoy seguro de cómo se manejaría mejor.

+0

desde su solución temporal (desde la última edición) básicamente está apagando csrf, puede apagar el middleware por completo, ¿no? :) –

+1

Tiene que estar activado para el resto del sitio (la parte del front-end) –

Respuesta

10

¿Qué le parece simplemente dividir una vista (s) para su cliente de escritorio y decorarlas con csrf_exempt?

+6

Esa es exactamente la configuración, pero 'csrf_exempt' no parece marcar la diferencia. Todavía da un 403 con ese decorador. +1 porque de acuerdo con el documento esto debería estar funcionando, aunque no lo sea. –

+3

Esto SÓLO es válido si no se puede acceder a la API a través del navegador. De lo contrario, esto es potencialmente muy peligroso ya que una solicitud podría falsificarse desde otro sitio, en contra de la API. –

-3

Desde Django 1.1, el código CSRF permitirá automáticamente el paso de solicitudes AJAX, ya que los navegadores parecen hacer las comprobaciones de seguridad adecuadas. Aquí está el original commit y el documentation.

+2

Hm, eso no es cierto, ¿verdad? En el enlace que proporcionó, indica que necesita agregar un encabezado adicional para que AJAX funcione, y no que funcione automáticamente. –

6

Si está utilizando una vista basada Clase continuación, tendrá que csrf_exempt el método de despacho en lugar del método post como este:

@method_decorator(csrf_exempt) 
def dispatch(self, request, *args, **kwargs): 
    return super(MyView, self).dispatch(request, *args, **kwargs) 

Ver este billete de errores: https://code.djangoproject.com/ticket/15794

Cuestiones relacionadas