我注意到很多 Rails 身份验证教程将用户 ID 存储在 session[:user_id] 中以记住用户并对其进行身份验证。假设在应用程序中的某个地方 user_ids 是公开的(URL、HTML 属性上的属性等),这不是不安全的,因为我可以编辑我的会话 cookie 以使用其他人的 user_id 吗?我在这里错过了什么吗?
问问题
2380 次
3 回答
9
根据Rails 安全指南:“为了防止会话散列篡改,从带有服务器端机密的会话中计算摘要并插入到 cookie 的末尾。”
所以看起来可以假定 Session 是安全的,不会被用户篡改(假设我们的服务器端机密是安全的)。但是,用户仍然可以读取会话哈希中的任何内容,因此我们不希望存储敏感信息。
于 2012-04-27T17:56:08.113 回答
5
cookie 往往不包含 user_id,它包含会话密钥,它本质上是一个随机的、无意义的字符串。会话存储在服务器上(在数据库、memcached 或像 redis 等的 nosql 存储中),并且会话保存用户 ID。
因此,给定用户的会话记录(仅限服务器端)可能包含以下数据:
key: asoiuoi09u23uo8789289askho2
user_id: 1234
并且 cookie(客户端)持有会话密钥,所以 cookie 看起来像这样:
name: somecookiename
site: www.yoursite.com
content: asoiuoi09u23uo8789289askho2
因此,要访问其他人的会话,您需要获取他们的会话密钥。这绝不是不可能的(参见 session-sniffing),但使用 https (这又需要 SSL 证书)变得更加困难。
于 2012-04-27T16:02:53.497 回答
0
一般来说,我的感觉是:session_id
,cookie session 是无用的,可以省略,因为大多数情况下在服务器端是不检查的。还是我错了?
在大多数情况下:user_id
,签名就足够了。
于 2013-04-08T18:22:45.843 回答