Rails sesiones prácticas actuales

¿Alguien tiene consejos de “mejores prácticas” para Rails y sesiones? El tipo de sesión predeterminado para Rails 3 sigue siendo CookieStore, ¿verdad? Usé SqlSessionStore por un tiempo y funcionó bien, pero puedo alejarme de eso en favor de CookieStore.

¿Todavía no es una buena idea usar CookieStore para información confidencial, incluso con información salada o es mejor almacenarla en la base de datos?

Use la base de datos para las sesiones en lugar del predeterminado basado en cookies, que no se debe usar para almacenar información altamente confidencial

Crea la tabla de sesión con

rake db:sessions:create 

Ejecute la migración

 rake db:migrate 

Asegúrese también de indicarle a los Rails que utilicen ActiveRecord para administrar sus sesiones también.

Carriles 3

config / initializers / session_store.rb:

 Rails.application.config.session_store :active_record_store 

Carriles 2

config / environment.rb:

 config.action_controller.session_store = :active_record_store 

Las cookies están encriptadas por defecto en Rails 4

En Rails 4, las cookies de CookieStore están encriptadas y firmadas por defecto:

Si solo tiene secret_token establecido, sus cookies se firmarán, pero no se cifrarán. Esto significa que un usuario no puede modificar su user_id sin conocer la clave secreta de su aplicación, pero puede leer fácilmente su user_id . Este fue el valor predeterminado para las aplicaciones de Rails 3.

Si tiene secret_key_base establecido, sus cookies serán encriptadas. Esto va un paso más allá de las cookies firmadas en que las cookies cifradas no pueden ser alteradas o leídas por los usuarios. Este es el inicio predeterminado en Rails 4.

Si tiene establecido tanto secret_token como secret_key_base , sus cookies serán encriptadas, y las cookies firmadas generadas por Rails 3 serán leídas y encriptadas transparentemente para proporcionar una ruta de actualización sin inconvenientes.

La tienda de sesión de registro activo está obsoleta en Rails 4

Esta respuesta ahora está desactualizada con respecto a Rails 4. La Tienda de sesiones de Active Record ha sido desaprobada y eliminada de Rails, por lo que los siguientes generadores ya no funcionarán:

  • rake db:sessions:create

  • rails generate session_migration

Esto fue señalado en esta respuesta . El motivo por el que la Tienda de sesiones de Active Record quedó en desuso es porque las lecturas / escrituras en la base de datos no se escalan bien cuando hay una gran cantidad de usuarios accediendo a su aplicación, como se indica en esta publicación de blog :

… un problema importante con la tienda de sesiones de Active Record es que no es escalable. Pone una carga innecesaria en su base de datos. Una vez que su aplicación recibe una gran cantidad de tráfico, la tabla de la base de datos de sesiones se bombardea continuamente con operaciones de lectura / escritura.

A partir de Rails 4, el almacén de sesiones de Active Record se ha eliminado del marco principal y ahora está en desuso.

Si aún desea utilizar la Tienda de sesiones de registro activo, todavía está disponible como una joya .

Prácticas recomendadas para la sesión actual de Rails

Para conocer las mejores prácticas actuales para las sesiones de Ruby on Rails, le aconsejo que consulte las últimas versiones de la Guía de seguridad de Ruby on Rails .

No creo que haya cambiado nada en cómo alguien en cualquier plataforma debe manejar sesiones basadas en cookies. Sea escéptico de cualquier cosa que vaya más allá del control del servidor (cookies, publicaciones de formularios, etc.). Ese es un principio general de desarrollo web.

En cuanto al cifrado, no sé si algo ha cambiado en ese frente.

Algo a tener en cuenta con una tienda de cookies es el límite de la cantidad de datos, y el hecho de que estos datos se enviarán por cable en cada solicitud, mientras que una tienda de bases de datos solo transfiere la identificación y la vida de los datos en el servidor .

FWIW, rails 3.1 sugiere correr

 rails generate session_migration 

Sin embargo, esto genera exactamente la misma migración que

 rake db:sessions:create 

Los valores predeterminados de Rails me parecen bastante buenos: el CookieStore es rápido y debe cubrir la mayoría de los casos de uso. Seguro que está limitado a 4kb y sus datos serán visibles para el usuario, pero la forma de Rails es usar solo la sesión para cosas como ID enteros y valores de cadena básicos: si está tratando de almacenar objetos o información altamente confidencial en sesión probablemente lo estás haciendo mal.