【问题标题】:Security of Rails authentication with session[:user_id]使用 session[:user_id] 进行 Rails 身份验证的安全性
【发布时间】:2012-04-27 15:53:54
【问题描述】:

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

【问题讨论】:

  • 你能链接到最近的一个例子吗?诸如 Devise 之类的解决方案非常标准,听起来像是旧版 Rails 的遗留问题。
  • 通常会生成某种会话 ID,并将其传递给 cookie,而不是用户 ID。

标签: ruby-on-rails


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    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 证书)变得更加困难。

    【讨论】:

    • 如果您将会话存储更改为使用数据库,这将是正确的,但我相信自 Rails 2 以来默认设置为 CookieStore。我假设默认 Rails 配置。
    【解决方案3】:

    一般来说,我的感觉是,cookie session 中的:session_id 是无用的,可以省略,因为在大多数情况下,它不会在服务器端进行检查。还是我错了?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-07
      • 2013-05-09
      • 2013-04-01
      • 2020-06-21
      • 1970-01-01
      相关资源
      最近更新 更多