2011-12-28 20 views

Respuesta

33

En general, es suficiente tener sólo one token per session, un denominado per-token de sesión:

En general, los desarrolladores sólo necesitan generar esta señal una vez para la sesión actual. Después de la generación inicial de este token, el valor se almacena en la sesión y se utiliza para cada solicitud posterior hasta que caduque la sesión.

Si desea mejorar aún más la seguridad, se puede usar una ficha por cada formulario/URL (per formar un símbolo de) para mitigar el impacto cuando una fuga de tokens (e. G. XSS) como una el atacante solo podría atacar con éxito esa forma/URL específica.

Pero usando tokens por solicitud, i. mi. fichas que cambian con cada solicitud, en vez corta la usabilidad del sitio web, ya que restringe la navegación en paralelo:

Para mejorar aún más la seguridad de este diseño propuesto, considere la aleatorización el token CSRF [...] para cada solicitud. La implementación de este enfoque da como resultado la generación de tokens por solicitud en oposición a los tokens por sesión. Tenga en cuenta, sin embargo, que esto puede generar problemas de usabilidad. Por ejemplo, la capacidad del navegador del botón "Atrás" a menudo se ve obstaculizada ya que la página anterior puede contener un token que ya no es válido. La interacción con esta página anterior dará como resultado un evento de seguridad falso positivo CSRF en el servidor.

Así que le recomiendo que utilice tokens por sesión o tokens por formulario.

+0

creo que por forma de fichas funcionarían si: ** a) ** Sólo se crea el token cuando el usuario carga la primera forma, cualquier carga el formulario posteriores deben volver a utilizar el primer token de esa forma. ** b) ** Al almacenar el token en la sesión, debe incluir un identificador para la página/formulario específico. P.ej. SESSION ['edit-user-csrf'] y SESSION ['edit-order-csrf'] y de esa manera puede abrir una página diferente en una pestaña diferente y los dos formularios pueden enviarse correctamente ya que la sesión está almacenando ambos tokens (uno para cada forma). La página sabe qué token csrf comprobar y usar porque está en esa página. – zuallauz

+0

Asegúrate de tener inactividad y tiempos de sesión absolutos que requieren una nueva autenticación y nueva generación de token. (Ejemplo: 20 minutos de inactividad o 4 horas absolutas) – LaJmOn

+0

@zuallauz La URL del formulario se puede usar para identificar el formulario. Si eso no es suficiente, puede agregar cualquier otra información de identificación (por ejemplo, valores de entrada ocultos) o, mejor aún, usar un [contenedor de formulario para almacenar los valores de entrada ocultos en] (http://stackoverflow.com/a/9108483/53114) que también [evitará la falsificación de valores de entrada ocultos] (http://stackoverflow.com/a/9209121/53114). – Gumbo

11

No, sólo tiene que generate a token on a per-session basis.

Es muy poco probable que los tokens se filtren accidentalmente por los usuarios y generar un token por formulario complica mucho las cosas si un usuario está navegando por el sitio en dos pestañas/ventanas diferentes a la vez.

+0

Gracias. Entonces, el token aún se colocará en todas las formas (¿pero el token por sesión no es diferente)? – Centurion

+0

Sí, eso es correcto. – Quentin

Cuestiones relacionadas