【发布时间】:2013-01-21 16:29:21
【问题描述】:
在我的应用程序中,我有一个 User 模型,它有一个 rememberable_token 列。创建用户时,会在before_create 过滤器中保存一个随机安全字符串,作为用户的安全令牌:
user.rememberable_token = SecureRandom.urlsafe_base64
在会话控制器中,它使用该令牌的值创建一个永久 cookie,以便用户在关闭浏览器时不会被注销,只有在他们通过logout 操作注销时才会被注销:
会话控制器:
def create
.
.
cookies.permanent.signed[:permanent_user_session] = user.rememberable_token
end
def logout
cookies.delete :permanent_user_session
redirect_to root_url
end
cookie 在应用程序控制器中用于确定是否存在当前用户,以及在一些控制器中用于确定用户是否已登录和授权的 before_filter 中。
应用程序控制器:
def current_user
@current_user ||= User.find_by_rememberable_token(cookies.signed[:permanent_user_session]) if cookies.signed[:permanent_user_session]
end
def authorize
unless User.find_by_rememberable_token(cookies.signed[:permanent_user_session])
render :action => 'login'
end
end
问题是这是安全的还是容易被会话劫持?如果它容易被劫持,如果在 session#logout 方法中它在删除现有 cookie 之前为用户创建了一个新的 rememberable_token(但不创建具有该值的新 cookie),是否可以?
谢谢。
【问题讨论】:
标签: ruby-on-rails-3 security session-cookies