Rails会议当前的做法

Luk*_*kas 82 ruby cookies session ruby-on-rails

任何人都有任何关于Rails和会话的"最佳实践"技巧?Rails 3的默认会话类型仍然是CookieStore,对吧?我使用SqlSessionStore已经有一段时间了,它运行良好,但我可能会偏离它,转而支持CookieStore.

将CookieStore用于敏感信息仍然不是一个好主意,即使是盐渍信息,还是更好地存储在数据库中?

小智 102

将数据库用于会话而不是基于cookie的默认值,不应将其用于存储高度机密的信息

使用创建会话表

rake db:sessions:create
Run Code Online (Sandbox Code Playgroud)

运行迁移

rake db:migrate
Run Code Online (Sandbox Code Playgroud)

确保您也告诉rails使用ActiveRecord来管理您的会话.

Rails 3

配置/初始化/ session_store.rb:

Rails.application.config.session_store :active_record_store
Run Code Online (Sandbox Code Playgroud)

Rails 2

到config/environment.rb:

config.action_controller.session_store = :active_record_store
Run Code Online (Sandbox Code Playgroud)

  • 如果您观察会话表增长并设置作业以相应地修剪它,则不会出现性能问题. (4认同)
  • 在这里,Rails 3.2,它类似于TheNameOfMyApplication :: Application.config.session_store:active_record_store (4认同)
  • 这与设计有冲突吗? (3认同)
  • 在Rails 4中不推荐使用`rake db:sessions:create`,因为它对于具有许多用户的应用程序(数据库读取和写入太多)不能很好地扩展.请参阅[rails 4.0,rake db:sessions:create](http://stackoverflow.com/a/17656159/456814). (3认同)
  • 我上次听说ARstore的会议速度非常慢.有人知道基准吗? (2认同)

小智 50

在Rails 4中默认加密Cookie

在Rails 4中,CookieStore cookie是默认加密和签名的:

如果您只secret_token设置了,您的cookie将被签名,但不会加密.这意味着用户无法在user_id不知道应用程序密钥的情况下更改自己的密钥,但可以轻松阅读user_id.这是Rails 3应用程序的默认设置.

如果您已secret_key_base设置,您的cookie将被加密.这比签名cookie更进一步,因为加密的cookie不能被用户更改或读取.这是Rails 4中的默认开头.

如果您同时设置secret_tokensecret_key_base设置,您的cookie将被加密,并且Rails 3生成的签名cookie将被透明地读取和加密,以提供平滑的升级路径.

活动记录会话存储在Rails 4中已弃用

对于Rails 4,这个答案现在已经过时了.活动记录会话存储已被弃用并从Rails中删除,因此以下生成器将不再起作用:

  • rake db:sessions:create

  • rails generate session_migration

这个答案指出了这一点.不推荐使用Active Record Session Store的原因是,当您有大量用户访问您的应用程序时,对数据库的读/写操作不能很好地扩展,如本博客文章所述:

... Active Record会话存储的一个主要问题是它不可扩展.它会给您的数据库带来不必要的负担.一旦您的应用程序收到大量流量,会话数据库表将继续受到读/写操作的轰炸.

从Rails 4开始,Active Record会话存储已从核心框架中删除,现在已弃用.

如果您仍想使用Active Record会话存储,它仍可作为gem使用.

当前的Rails会话最佳实践

对于Ruby on Rails会话的更新当前最佳实践,我建议您查看最新版本的Ruby on Rails安全指南.


Til*_*dor 9

我不相信任何平台上的任何人应该如何处理基于cookie的会话有任何改变.对超出服务器控制范围的任何事情持怀疑态度(cookie,表格帖子等)这是Web开发的一般原则.

至于加密,我不知道在这方面是否有任何改变.

使用cookie存储需要注意的是数据量的限制,以及在每个请求中将这些数据发送到线上的问题,因为数据库存储只传输id和数据存在于服务器上.