我正在运行 Ruby on Rails 3,我想知道我为用户身份验证设置 cookie 值所使用的代码是否足够强大。
在我的模型中我有:
require 'digest'
class User < ActiveRecord::Base
...
def make_cookie_id_salt(string)
secure_hash("#{self.id}--#{string}")
end
def secure_hash(string)
Digest::SHA2.hexdigest(string)
end
end
在我的 Controller 中我有:
cookies.signed[:current_user_id] = { :value => [@user.id, @user.make_cookie_id_salt(@user.id)], :expires => 15.days.from_now }
它够强吗?如果不是,我该如何改进(举个例子!)?
最佳答案
放入 cookie 中的所有内容都以纯文本形式存储。
如果您设置了一个 cookie,然后在您的浏览器中检查 cookie,您会注意到(在您的情况下,cookie 名称将是 current_user_id)它由一串字符表示,例如:G8gcm9sbCB5b3VyIG93biBhdXRoIHRvIGt...(不是很清楚文本,对吗?它实际上是 Base64 编码的,但您可以轻松阅读它 - require('base64'); Base64.decode64(string)).
Rails 存储一个特殊的 _yourapp_session cookie,用于检查 cookie 的有效性。例如,如果某人/某事试图修改它,它将被拒绝。
现在,在您的情况下,您是否尝试对 cookie 中的某些内容进行哈希处理并不重要。 它仅用于身份验证(通过他的 ID 在数据库中查找用户)并且您没有存储任何唯一的 secret 数据(无论如何您都不应该将其放在 cookie 中,但这是散列某些东西的唯一原因)
当然有人可以窃取用户的 cookie(如果他使用公共(public)计算机并且没有清除他的缓存等)并登录,但是没有办法阻止这种情况(无论是哪种散列)用于混淆它)
总而言之,您应该对现有的一切感到满意。
关于ruby-on-rails - 我的 cookie token 是否足够强大,可以用于用户身份验证目的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4976159/