Práticas atuais das sessões Rails


83

Alguém tem alguma dica de "melhores práticas" para Rails e sessões? O tipo de sessão padrão para Rails 3 ainda é CookieStore, certo? Usei SqlSessionStore por um tempo e funcionou bem, mas posso me afastar disso em favor do CookieStore.

Ainda não é uma boa ideia usar CookieStore para informações confidenciais, mesmo com informações salgadas ou isso é melhor armazenado no banco de dados?


1
Além disso, quais são as ideias atuais sobre o uso do Memcached para armazenamento de sessão?
Lukas

Respostas:


102

Use o banco de dados para sessões em vez do padrão baseado em cookies, que não deve ser usado para armazenar informações altamente confidenciais

Crie a tabela de sessão com

rake db:sessions:create

Execute a migração

rake db:migrate

Certifique-se também de dizer aos rails para usar ActiveRecord para gerenciar suas sessões também.

Rails 3

config / initializers / session_store.rb:

Rails.application.config.session_store :active_record_store

Rails 2

config / environment.rb:

config.action_controller.session_store = :active_record_store

2
Ouvi pela última vez que o ARstore para sessões era muito lento. alguém sabe de benchmarks?
Lukas

4
Se você observar o crescimento da tabela de sessões e configurar um trabalho para podá-la de acordo, não terá problemas de desempenho.
Bill Leeper

3
Isso está em conflito com o dispositivo?
David Mauricio

4
Aqui, Rails 3.2, é algo como TheNameOfMyApplication :: Application.config.session_store: active_record_store
Eduardo

3
O rake db:sessions:createestá obsoleto e removido no Rails 4, porque não é escalável para aplicativos com muitos usuários (muitas leituras e gravações de banco de dados). Veja rails 4.0, rake db: sessions: create .

53

Os cookies são criptografados por padrão no Rails 4

No Rails 4, os cookies CookieStore são criptografados e assinados por padrão:

Se você apenas secret_tokendefiniu, seus cookies serão assinados, mas não criptografados. Isso significa que um usuário não pode alterar o seu user_idsem saber a chave secreta do seu aplicativo, mas pode facilmente ler a sua user_id. Este era o padrão para aplicativos Rails 3.

Se você secret_key_basedefiniu, seus cookies serão criptografados. Isso vai além dos cookies assinados, pois os cookies criptografados não podem ser alterados ou lidos pelos usuários. Este é o padrão a partir do Rails 4.

Se você tiver os dois secret_tokene secret_key_basedefinido, seus cookies serão criptografados e os cookies assinados gerados pelo Rails 3 serão lidos e criptografados de forma transparente para fornecer um caminho de atualização suave.

O armazenamento de sessão do Active Record está obsoleto no Rails 4

Esta resposta agora está desatualizada em relação ao Rails 4. O Active Record Session Store foi descontinuado e removido do Rails, então os seguintes geradores não funcionarão mais:

  • rake db:sessions:create

  • rails generate session_migration

Isso foi apontado nesta resposta . A razão pela qual o Active Record Session Store foi preterido é porque as leituras / gravações no banco de dados não escalam bem quando você tem um grande número de usuários acessando seu aplicativo, conforme declarado nesta postagem do blog :

... um grande problema com o armazenamento de sessão do Active Record é que ele não é escalável. Isso coloca uma carga desnecessária em seu banco de dados. Depois que seu aplicativo recebe uma grande quantidade de tráfego, a tabela de banco de dados de sessões é continuamente bombardeada com operações de leitura / gravação.

A partir do Rails 4, o armazenamento de sessão do Active Record foi removido da estrutura principal e agora está obsoleto.

Se você ainda deseja usar o Armazenamento de Sessão do Active Record, ele ainda está disponível como uma jóia .

Melhores práticas atuais da sessão Rails

Para mais práticas recomendadas atuais para sessões de Ruby on Rails, aconselho que você verifique as versões mais recentes do Guia de segurança Ruby on Rails .


9

Não acredito que nada mudou em como qualquer pessoa em qualquer plataforma deve lidar com sessões baseadas em cookies. Seja cético em relação a tudo o que vai além do controle do servidor (cookies, postagens de formulários, etc.). Esse é um princípio geral de desenvolvimento web.

Quanto à criptografia, não sei se mudou alguma coisa nesse aspecto.

Algo para se ter em mente com um armazenamento de cookies é o limite para a quantidade de dados, e a pegadinha de que esses dados serão enviados na transferência em cada solicitação, onde, como um armazenamento de banco de dados, apenas transfere o id e os dados ficam no servidor .


4

FWIW, rails 3.1 sugere execução

rails generate session_migration

No entanto, isso gera exatamente a mesma migração que

rake db:sessions:create

Na mesma nota, a tarefa rake db:sessions:createagora invoca diretamente o session_migrationgerador. tarefa: criar =>: ambiente levanta "Tarefa indisponível para este banco de dados (sem suporte de migração)" a menos que ActiveRecord :: Base.connection.supports_migrations? requer 'rails / geradores' Rails :: Generators.configure! require 'rails / generators / rails / session_migration / session_migration_generator' Rails :: Generators :: SessionMigrationGenerator.start [ENV ["MIGRAÇÃO"] || "add_sessions_table"] fim
inclinação de

Os geradores rake db:sessions:createe rails generate session_migrationestão obsoletos e foram removidos no Rails 4, porque eles não escalam bem para aplicativos com muitos usuários (muitas leituras e gravações de banco de dados). Veja rails 4.0, rake db: sessions: create .

2

Os padrões do Rails parecem muito bons para mim - O CookieStore é rápido e deve cobrir a maioria dos casos de uso. Claro que você está limitado a 4kb e seus dados ficarão visíveis para o usuário, mas a maneira do Rails é usar a sessão apenas para coisas como IDs inteiros e valores de string básicos - Se você está tentando armazenar objetos ou informações altamente confidenciais na sessão provavelmente você está fazendo errado.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.