【发布时间】: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