【问题标题】:Security Model in Rails QuestionRails 问题中的安全模型
【发布时间】:2011-07-02 01:22:41
【问题描述】:

我正在阅读一篇很棒的 Rails tutorial 并看到一段我有疑问的文章:

方框 9.2.Sessions 和 cookie 因为 HTTP 是一种无状态协议,Web 需要用户登录的应用程序 必须实施一种方法来跟踪每个 用户从一页到另一页的进度。一 维护用户的技术 登录状态是使用传统的 Rails 会议(通过特别会议 函数)来存储一个记忆令牌 等于用户的id:

会话[:remember_token] = user.id 这个会话对象使用户 id 通过存储从一页到另一页可用 它在一个过期的cookie中 浏览器关闭。在每一页上, 应用程序可以简单地调用
User.find_by_id(session[:remember_token]) 检索用户。由于 Rails 处理会话的方式,这 过程是安全的;如果恶意用户 试图欺骗用户 id,Rails 会 检测基于特殊的不匹配 为每个会话生成的会话 ID。 对于我们应用程序的设计选择, 这涉及持久性 会话——即,登录状态 即使在浏览器关闭后仍然存在 - 存储 用户 ID 是一个安全漏洞。作为 一旦我们打破了 特殊会话 id 和存储的用户 id,恶意用户可以登录为 具有 remember_token 的用户等于 到用户的id。为了修复这个缺陷,我们 生成独特、安全的记忆 每个用户的令牌基于 用户的盐和身份证。此外,一个 永久记住令牌也会 代表一个安全漏洞——通过 检查浏览器 cookie,a 恶意用户可以找到令牌 然后使用它从任何 其他电脑,随时。我们解决 这通过向 令牌,并每次重置令牌 用户登录应用程序。 这会导致持久会话 基本上不受攻击。

我不明白这是在说什么。我从中得到一个唯一的会话 ID 被创建并存储在客户端的 cookie 中。然后,当该 cookie 在请求中发送到服务器时,服务器知道这是有问题的用户,以便可以持久登录。但是,如果恶意用户窃取了 cookie,我不明白他们为什么无法从另一台计算机登录。作者说这可以通过添加时间戳来解决,但我看不出这有什么帮助。此外,作者说每次用户登录时都会重置令牌,但整点是持久登录,所以我不明白。请帮忙!

【问题讨论】:

    标签: ruby-on-rails security session-cookies


    【解决方案1】:

    您是对的——“记住我”cookie 可用于窃取登录信息。他们试图解决的问题是,如果有人窃取了您的包含您的唯一标识符的 cookie 并继续使用它,那么他们将能够在未来的任何时候登录您的帐户。

    通常的解决方案是在您每次使用或者用户名/密码“记住我”cookie 登录您的帐户时,使所有以前的 cookie 无效,以便给定的 cookie 将允许您登录一次。时间戳是他们确保每个 cookie 唯一性的方式。

    如果您担心 cookie 被盗,一个典型的解决方案是同时存储请求来自的 IP 地址,如果 cookie 来自的 IP 地址与 cookie 的 IP 地址不匹配是从创建的,拒绝登录并强制用户登录。这对于动态代理背后的用户或携带笔记本电脑往返工作/家庭/咖啡店的用户可能会很不方便,因为他们的 IP 地址将改变所有时间。

    “记住我”是一个设计上的安全漏洞。目标是限制漏洞的大小,如果您正在设计一个需要绝对安全的系统,那么这不是一个好的选择。如果方便比安全更重要,那么使用时间戳和 cookie 失效可以限制潜在的安全问题。

    如果您对有关此主题的更多信息感兴趣,Rails 指南的Security Guide 部分有一个完整的会话部分。

    【讨论】:

      猜你喜欢
      • 2019-03-08
      • 2011-03-19
      • 2021-03-31
      • 1970-01-01
      • 2011-10-19
      • 1970-01-01
      • 2011-01-10
      • 2011-10-19
      • 1970-01-01
      相关资源
      最近更新 更多