5

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

4

3 回答 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 回答