2012-02-09 14 views
7

He heredado un proyecto symfony2 que en el entorno activo se ejecuta en más de 2 servidores de carga equilibrada. La sesión se almacena en la base de datos mysql que utiliza la aplicación por este motivo.CSRF token no válido en la carga de la aplicación symfony2 compensada

El problema que estoy teniendo es que en formularios que tienen protección CSRF a veces el token no es válido. Supongo que esto se debe a que el servidor que generó el token no es siempre el servidor que obtiene el formulario POST y no puede coincidir con el token que se envía.

Soy muy, muy nuevo en Symfony y he intentado algunas soluciones diferentes para generar el token usando la sesión y SessionCsrfProvider desde el framework Symfony.

¿Alguien puede señalarme en la dirección correcta o ha tenido un problema similar?

+0

¿Funciona la sesión como se esperaba? –

+0

Sí, la gestión de sesión para usuarios funciona bien. Es solo la advertencia del token csrf que se activa si el formulario se publica en el servidor del que no se originó. He probado esto simplemente trabajando en uno de los servidores de carga balanceada usando la dirección IP. – chrishey

+0

Lo que estoy luchando es entender si el SessionCsrfProvider está usando la sesión almacenada en la base de datos o no. ¿Algún consejo sobre la depuración? es difícil de probar ya que el único entorno de equilibrio de carga que tenemos es en vivo. Gracias – chrishey

Respuesta

2

Los CsrfProviders generarán tokens concatenando la clave secreta (desde parameters.ini) + intención (por defecto es nulo) + la identificación de sesión.

De forma predeterminada, Symfony está configurado para usar el SessionCsrfProvider, que utiliza la sesión de almacenamiento id.

Si está utilizando el objeto PDOSessionStorage o NativeSessionStorage, devolverá el session_id().

Podría significar que su session_id() no es lo mismo dependiendo de qué máquina maneje la solicitud.

+3

Parece que la solución fue que la clave secreta parameters.ini no era la misma en ambos servidores e incluso cuando la corregí no tuvo efecto hasta que quité la memoria caché de la aplicación y reinicié apache en ambos servidores varias veces. Gracias por toda tu ayuda. – chrishey

Cuestiones relacionadas