2012-03-30 14 views
6

Estoy escribiendo mi comprensión del mecanismo csrf protcetion en django. Corrígeme si es defectuoso.comprensión csrf en django campo oculto en forma y CSRFCookie

csrfViewMiddleware crea una cadena única y la almacena en un campo oculto 'csrfmiddlewaretoken' de un formulario que se origina en el host. Dado que un sitio web malicioso que imita este formulario no conocerá el valor de este campo, no puede usarlo.

Cuando alguien intenta publicar un formulario, el sitio web comprueba el campo 'csrfmiddlewaretoken' y su valor. Si es incorrecto o no se establece, se detectará un intento de csrf.

Pero entonces, ¿qué es exactamente el CSRFCookie? The doc dice que el valor único se establece en CSRFCookie y también en hidden field.Esto es donde estoy confundido. ¿Se envía una cookie al navegador con la cadena única incrustada? Deseo que alguien pueda explicar esto con claridad.

gracias,

Respuesta

5

Ok, así que aquí va mi explicación:

Django asigna un usuario autenticado un token CSRF que se almacena en una cookie. El valor de esta cookie se lee cada vez que un usuario realiza una solicitud que se considera "insegura" (es decir, POST, PUT, DELETE) para validar que el usuario, no un tercero malintencionado, realiza la solicitud.

La etiqueta CSRF que coloca en un formulario realmente toma el token CSRF de la cookie y luego lo pasa como una variable POST al enviar un formulario.

Espero que eso lo aclare un poco.

+0

De modo que solo el navegador de un usuario autenticado obtiene este token y no todos los que visitan el sitio. ¿Es correcto? – damon

+0

No estoy seguro de cómo exactamente lo maneja Django: puede proteger a todos los usuarios independientemente del estado de autenticación. Básicamente, cualquier acción que tenga la capacidad de cambiar alguna faceta de su aplicación debe tener protección CSRF. – Todd

1

Según mi comprensión actual, no estoy del todo satisfecho con la respuesta validada.

Puede encontrar mi versión here.

En resumen, CSRFCookie es "seguro", en el sentido de que el atacante no puede acceder a él debido a la política de origen. El navegador enviará este valor automáticamente. Ahora, su formulario también debe enviar este valor (por ejemplo, en un campo oculto). Esto significa que su formulario debe conocer este valor, y puede obtenerlo de la cookie.

El atacante no puede obtener el token de la cookie y, por lo tanto, no puede forjar un código malicioso que contenga el token.

Lo que es importante, al final, es que el usuario puede enviar un token csrf, y que el servidor puede verificarlo. Usar una cookie es una forma conveniente de hacerlo, pero esto podría implementarse de manera diferente (por ejemplo, el servidor podría guardar los tokens CSRF para cada sesión, por ejemplo).

No soy un especialista, pero así es como lo entiendo. Espero eso ayude.