【发布时间】:2012-03-11 00:28:34
【问题描述】:
我需要在 Rails 的 cookie 中存储一小段数据(少于 10 个字符),并且我需要它是安全的。我不希望任何人能够读取该数据或注入他们自己的数据(因为这会使应用程序面临多种攻击)。我认为加密 cookie 的内容是可行的方法(我也应该签名吗?)。最好的方法是什么?
现在我正在这样做,这看起来很安全,但是对于比我更了解安全的人来说,很多事情看起来很安全,然后发现它并不真正安全。
我是这样保存秘密的:
encryptor = ActiveSupport::MessageEncryptor.new(Example::Application.config.secret_token)
cookies[:secret] = {
:value => encryptor.encrypt(secret),
:domain => "example.com",
:secure => !(Rails.env.test? || Rails.env.development?)
}
然后我是这样读的:
encryptor = ActiveSupport::MessageEncryptor.new(Example::Application.config.secret_token)
secret = encryptor.decrypt(cookies[:secret])
这样安全吗?有更好的方法吗?
更新:我知道 Rails 的 session 以及它的安全性,通过签署 cookie 和可选地存储 session 服务器端的内容,我确实使用 session 是什么为了。但我的问题是关于存储 cookie,这是我在会话中不想要的一条信息,但我仍然需要它是安全的。
【问题讨论】:
-
出于兴趣,为什么需要将其存储在 cookie 中而不是服务器端,因为它在定义上更安全?
-
@russell 好吧,你需要在浏览器中存储一些东西,对吧?否则你将无法再次识别它。无论是实际数据还是表上记录的 id,这都是关于数据大小和其他考虑的偏好和必要性问题。我存储的已经是表中记录的 id。我可以创建另一个表,但在这种情况下似乎很浪费。
-
我添加了一个答案,因为我认为将默认会话存储更改为使用数据库将为您提供所需的安全性,而在创建表等方面的开销很小。
-
@Russell 我不想使用会话。我的会话是针对每个域 (blah.example.com) 而这段数据是针对整个系统 (.example.com),因此设置它时的域选项。
标签: ruby-on-rails security cookies encryption