是否有人对Rails和会话有“最佳实践”技巧?Rails 3的默认会话类型仍然是CookieStore,对吗?我使用SqlSessionStore已有一段时间,并且效果很好,但是我可能会改用CookieStore来代替它。
使用CookieStore获取敏感信息(即使是含盐信息)还是不是一个好主意,还是更好地存储在数据库中?
是否有人对Rails和会话有“最佳实践”技巧?Rails 3的默认会话类型仍然是CookieStore,对吗?我使用SqlSessionStore已有一段时间,并且效果很好,但是我可能会改用CookieStore来代替它。
使用CookieStore获取敏感信息(即使是含盐信息)还是不是一个好主意,还是更好地存储在数据库中?
Answers:
使用数据库进行会话,而不要使用基于cookie的默认值,该默认值不应用于存储高度机密的信息
使用创建会话表
rake db:sessions:create
运行迁移
rake db:migrate
确保您还告诉Rails也使用ActiveRecord来管理会话。
config / initializers / session_store.rb:
Rails.application.config.session_store :active_record_store
config / environment.rb:
config.action_controller.session_store = :active_record_store
rake db:sessions:create
已废弃,除去轨道4,5,因为它不与众多用户的应用很好地扩展(太多数据库读取和写入)。参见rails 4.0,rake db:sessions:create。
在Rails 4中,默认情况下,CookieStore cookie被加密并签名:
如果只进行
secret_token
设置,则将对Cookie进行签名,但不会对其进行加密。这意味着用户无法在user_id
不知道您应用程序的密钥的情况下更改其密码,但可以轻松读取其密码user_id
。这是Rails 3应用程序的默认设置。如果已
secret_key_base
设置,您的cookie将被加密。这与签名的cookie相比更进一步,因为加密的cookie无法由用户更改或读取。这是从Rails 4开始的默认设置。如果同时设置了两者
secret_token
,secret_key_base
则将对cookie进行加密,并且将透明地读取和加密由Rails 3生成的签名cookie,以提供一个平滑的升级路径。
现在,有关Rails 4的答案已经过时了。Active Record Session Store已过时并已从Rails中删除,因此以下生成器将不再起作用:
rake db:sessions:create
rails generate session_migration
这个答案指出了这一点。不推荐使用Active Record会话存储区的原因是,如本文博文所述,当您有大量用户访问应用程序时,对数据库的读/写不能很好地扩展:
... Active Record会话存储的一个主要问题是它不可扩展。它将对您的数据库造成不必要的负载。一旦您的应用程序接收到大量流量,会话数据库表就会被读/写操作连续轰炸。
从Rails 4开始,Active Record会话存储已从核心框架中删除,现在已弃用。
如果您仍然想使用Active Record会话存储,它仍然可以作为gem使用。
有关Ruby on Rails会话的最新最佳实践,建议您查看Ruby on Rails安全指南的最新版本。
FWIW,rails 3.1建议运行
rails generate session_migration
但是,这会产生与迁移完全相同的迁移
rake db:sessions:create
db:sessions:create
现在直接调用session_migration
生成器。task:create =>:environment确实会引发“该数据库不可用的任务(不支持迁移)”,除非ActiveRecord :: Base.connection.supports_migrations?需要'rails / generators'Rails :: Generators.configure!需要'rails / generators / rails / session_migration / session_migration_generator'Rails :: Generators :: SessionMigrationGenerator.start [ENV [“ MIGRATION”] || “ add_sessions_table”]结束
rake db:sessions:create
和rails generate session_migration
发电机否定并取消在轨道4,5,因为它们不与众多用户的应用很好地扩展(太多数据库读取和写入)。参见rails 4.0,rake db:sessions:create。