2011-05-22 22 views
5

Estoy usando Rails 3.0.2 que tiene protect_from_forgery de forma predeterminada en application_controller.rb.Rails 3 protect_from_forgery no funciona correctamente?

Quería disparar un InvalidAuthenticityToken.
Para hacer esto he añadido este Javascript a mi página:

$('input[name=authenticity_token]').val('aaa') 

Comprobación del DOM con Firebug veo el campo oculto authenticity_token se actualiza correctamente.

Si envío el formulario y verifico el registro desde el servidor, veo que el parámetro relativo está configurado correctamente en 'aaa'. ¡Esperaría obtener un InvalidAuthenticityToken mientras la solicitud se procesa como era correcta!

¿Cómo es esto posible?

+1

debe aceptar la respuesta ya que resolvió su pb. – apneadiving

+0

reiniciar sesión no es suficiente para proteger contra CSRF. en los rieles 4, la contramedida predeterminada genera una excepción, que es mucho más segura. –

Respuesta

12

La documentación del comportamiento de token de autenticidad/csrf está desactualizada. La excepción InvalidAuthenticityToken ya no se lanza en estos casos, en su lugar su sesión se acaba de restablecer. Si desea manejar esto de manera diferente (o de la manera antigua) puede definir su propio comportamiento en handle_unverified_request en su controlador.

+0

¡Muchas gracias! ¡Lo hice y funciona perfectamente! – Diego

1

También creo que tendrías que restablecer el token de autenticidad que reside en la metaetiqueta de la página html en la que está tu formulario (supongo que tienes el <% = csrf_meta_tag%> allí). Rails comprueba si el token en el formulario (que modificó en su javascript anterior) o el token en la metaetiqueta de la página html coinciden con el token de autenticidad esperado de Rails, y si CUALQUIERA de ellos coincide, entonces su InvalidAuthenticityToken ganó ' t se activará ....

Cuestiones relacionadas