使用session [:user_id]进行Rails身份验证的安全性

时间:2012-04-27 15:53:55

标签: ruby-on-rails

我注意到很多Rails身份验证教程在session [:user_id]中存储用户ID以记住用户并对其进行身份验证。假设应用程序中某处公开暴露了user_ids(URL,HTML属性上的属性等),这不是不安全的,因为我可以编辑我的会话cookie以使用其他人的user_id吗?我在这里错过了什么吗?

3 个答案:

答案 0 :(得分:9)

根据Rails Security Guide: “为防止会话哈希篡改,将从具有服务器端密钥的会话中计算摘要,并将其插入到cookie的末尾。”

所以看起来Session可以被认为是安全的,不会被用户篡改(假设我们的服务器端保密是安全的)。但是,用户仍然可以读取会话哈希中的任何内容,因此我们不希望存储敏感信息。

答案 1 :(得分:5)

cookie往往不包含user_id,它包含会话密钥,它本质上是一个随机的,无意义的字符串。会话存储在服务器上(在数据库中,或memcached中,或像redis等的nosql存储中),会话保存用户ID。

因此,给定用户的会话记录(仅限服务器端)可能包含以下数据:

key:  asoiuoi09u23uo8789289askho2
user_id: 1234

cookie(客户端)持有会话密钥,因此cookie看起来像这样:

name: somecookiename
site: www.yoursite.com
content: asoiuoi09u23uo8789289askho2

因此,要访问其他人的会话,您需要获取其会话密钥。这绝不是不可能的(参见会话嗅探),但使用https(这又需要SSL证书)会变得更加困难。

答案 2 :(得分:0)

一般来说,我觉得cookie会话中的:session_id是无用的,可以省略,因为在大多数情况下,服务器端没有检查它。或者我错了?

在大多数情况下:user_id并签名就足够了。