2011-09-15 21 views
11

Acabo de configurar una protección simple CSRF en mi aplicación. Crea una miga única que se valida con un valor de sesión al enviar un formulario.Fichas CSRF: ¿cómo implementarlas correctamente?

Desafortunadamente esto significa ahora que no puedo mantener varias instancias (pestañas en el navegador) de mi solicitud abierta al mismo tiempo como las migas CSRF chocan entre sí.

Debería crear una ficha individual para cada forma real o utilizar una miga mutua, compartida por todos mis formas? ¿Qué son el sentido común aquí?

Respuesta

5

Usted puede hacer cualquiera de los dos. Depende del nivel de seguridad que desee.

La API de seguridad de la empresa OWASP (ESAPI) utiliza el método único token por sesión de usuario. Ese es probablemente un método bastante efectivo suponiendo que no tiene agujeros XSS y tiene tiempos de espera de sesión razonablemente cortos. Si permite que las sesiones permanezcan con vida durante días o semanas, entonces este no es un buen enfoque.

Personalmente, no encuentro difícil el uso de un símbolo diferente para cada instancia de cada forma. Guardo una estructura en la sesión del usuario con pares clave-valor. La clave para cada elemento es la ID del formulario, el valor es otra estructura que contiene el token y una fecha de vencimiento para ese token. Normalmente, solo permitiré que un token viva 10-20 minutos, luego caducará. Para formularios más largos, puedo darle un tiempo de expiración largo.

Si desea ser capaz de soportar el mismo formulario en varias pestañas del navegador en la misma sesión, entonces mi método se vuelve un poco engañoso, pero aún podría hacerse fácilmente teniendo identificaciones de formulario únicas.

+0

¿Quieres decir que cada instancia de cada formulario tiene su propio token? Es decir. ''? – Industrial

+4

Creo que tener un único token por sesión es razonable siempre y cuando no los envíe a través de http (solo https). Comparten muchas preocupaciones de seguridad con los identificadores de sesión. Si tiene XSS, el atacante puede abrir iframes, leer los tokens y hacer CSRF de todos modos. – Erlend

+0

Si tiene XSS, ya ha perdido. Los nonces adicionales por formulario no lo salvarán (el atacante podrá obtener un nuevo formulario, con nueva versión, completarlo y enviarlo, tal como lo haría el usuario). El valor único por usuario es absolutamente suficiente para CSRF. – Kornel

1

En primer lugar: no soy un experto en seguridad, por lo que probablemente no deberías confiar en lo que digo.

Creo que generar un token diferente para cada formulario es más seguro. Considere una vulnerabilidad XSS en una página que le permita al atacante obtener el token CSRF para esa forma. Si todos los formularios usan el mismo token, el atacante ahora tiene los tokens CSRF para todos los formularios. Si todas las formas tienen tokens diferentes, el ataque puede ser de un alcance mucho menor.

+3

Lo sentimos, pero si tiene XSS, el atacante simplemente puede abrir iframes en los formularios y leer los tokens de ellos. Si tiene XSS, el método de token falla, y lo mismo se aplica al método de doble envío de cookies para evitar XSS. – Erlend

-3

Como sé sobre CSRF, puede utilizar

1) de números aleatorios y guardarlo en la sesión:
añadirlo a la entrada oculta llamada oculta, entonces cuando usted recive información se puede comprobar campo oculto con el valor de sesión

2) variable de configuración estática (como anterior, pero no hay ninguna sesión)
el campo oculto contendrá este valor (variable de configuración). Cuando se valida, se registrará El árbitro oculta publicado y el valor de la clave de seguridad de configuración

3) HTTP
Puede usar referencia HTTP saber dónde usuario venir a partir de entonces comprobarlo con el dominio real (este método puede atacar si su sitio web contiene xss).

Como sé que usted puede utilizar cualquier solución :)

+1

Tu segundo ejemplo; ¿Cómo puede sugerir el uso de una variable estática como un token CSRF? La idea detrás de los tokens es su singularidad, lo que significa que nadie debería ser capaz de adivinar de antemano cuál sería el token. ¿Cómo diablos esto haría que alguna forma sea más segura? – Industrial

+1

2 no funciona, ya que la clave no es individual por usuario. 3 no se recomienda, ya que muchos cortafuegos de empresas eliminan el encabezado del referer, y es realmente irrealizable. – Erlend

+0

HTTP Referer no es una forma segura de vencer a CSRF. (Tampoco es una variable estática.) –

4

El OWASP Cheat Sheet tiene las respuestas más definitivas para este tipo de cosas. Discute diferentes enfoques y el equilibrio de la seguridad frente a la usabilidad.

En resumen, recomiendan tener un solo token por sesión (navegador). En otras palabras, en tu caso, el mismo token se comparte entre las pestañas. La hoja de trucos también enfatiza que es muy importante no exponer su sitio a vulnerabilidades de secuencias de comandos entre sitios, ya que esto subvierte la estrategia de tokens CSRF por sesión.