2012-07-23 15 views
7

ser un principiante en las cookies, CSRF y Django (usando 1.4), por lo que he podido averiguar es así como funciona, por favor me corrija dónde vaya mal ...¿Es así como funciona la protección CSRF de Django?

Lo siguiente se aplica cuando django.middleware. csrf.CsrfViewMiddleware se incluye en la tupla MIDDLEWARE_CLASSES.

Cuando un formulario POST incluye la etiqueta csrf_token, y la vista correspondiente pasa RequestContext a la plantilla, solicitar que la página signifique que Django incluye un campo de formulario oculto que contiene una cadena alfanumérica. Django también devuelve al navegador una cookie con el nombre establecido en csrftoken y el valor establecido en la misma cadena alfanumérica.

Al recibir el envío del formulario, Django comprueba que el valor de la cadena alfanumérica del campo de formulario oculto coincide y la cookie csrftoken recibida del navegador. Si no coinciden, se emite una respuesta 403.

Un ataque CSRF puede venir en la forma de un sitio web malicioso que incluye un iframe. El iframe incluye un formulario POST y algo de JavaScript. El atributo action del formulario apunta a mi sitio Django. El formulario está diseñado para hacer algo desagradable en mi sitio, y JS envía el formulario cuando se carga el iframe.

El navegador incluiría la cookie csrftoken en el encabezado del envío del formulario. Sin embargo, el formulario no incluiría el campo oculto con la cadena alfanumérica correspondiente, por lo que se devuelve un 403 y el ataque falla. Si el iframe JS intentó acceder a la cookie, para crear el campo de formulario hiddden correcto, el navegador evitaría que lo haga.

¿Es esto correcto?

+1

No veo nada malo. Tal vez otros lo harán, pero en general, lo tienes. – Zashas

Respuesta

0

diría que tiene usted razón. Encontrará here mi propia formulación de la misma.

En resumen:

  • El token CSRF se envía desde el código, lo que significa que el código malicioso debe saberlo.
  • El token CSRF se almacena en una cookie y el navegador lo envía.
  • El atacante no puede acceder a la cookie debido a la política del mismo origen.
  • El servidor simplemente puede verificar que el valor "seguro" que proviene de la cookie es el mismo que el que proviene del código.
1

Creo que lo que quiere se describe aquí en la documentación oficial de Django. https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#how-it-works

el enlace de arriba se rompió cuando lo probé, pero para la versión 1.7 funciona esto: https://docs.djangoproject.com/en/1.7/ref/contrib/csrf/

+1

Gracias por el enlace. Dice: "Esto garantiza que solo los formularios que se hayan originado desde su sitio web se puedan usar para POST devolver la información". pero no dice _how_ eso lo asegura. –

+0

No he buscado esa parte del código base de Django recientemente, pero si sé de otro lado, usa UrlParse para detectar la url base y si la URL base no coincide con la URL del host, devolverá un error o fallará en silencio. (Silenciosamente falla cuando intentas devolver una respuesta a otro esquema como foo: // – fundamol

Cuestiones relacionadas