在rails中实现会话

时间:2008-12-27 04:37:17

标签: ruby-on-rails ruby ssl

我正在第一次通过滚动我自己的身份验证和会话,我不确定我是否理解现有的会话支持。 (通过第一遍,我的意思是我最初通过http进行身份验证,而不是https。生产代码将使用https。)

我对安全会话的理解是您通过SSL上的cookie将令牌传递给浏览器,然后将该令牌与存储在服务器上的令牌进行比较,看看它是否真的是您认为的用户。我希望你们能够检查我对安全会话的理解,具体如下:

  1. 用户获取登录页面并提交登录名和密码(通过SSL发送)。
  2. 服务器检查协议,然后检查密码的sha1(通常是+ salt)与db中的现有哈希。如果它们匹配,则生成会话ID,将其放在具有用户标识的(n SSL)cookie中以及服务器端会话存储中。将用户重定向到站点的安全区域。
  3. 该会话ID在整个用户的登录会话中保持不变 - 或者 - 服务器在每次安全操作后发出新的会话ID,通过SSL cookie发送并将新值存储在数据库中。
  4. 涉及私有或安全数据的任何操作都会检查会话存储是否存在此用户的会话ID,如果存在,则在执行操作之前将cookie的session_id与会话存储进行比较。如果我们正在轮换会话ID,请在操作后发出新的会话ID(SSL cookie和服务器端存储)。
  5. 用户注销,告知服务器从会话存储中删除会话ID并清除cookie。或者cookie在浏览器和/或服务器上过期,需要重新验证。
  6. 以上是否有任何明显的错误?此外,如果cookie中的令牌仅仅是会话ID,Rails的session []支持似乎不会阻止MITM攻击。这是对的吗?

3 个答案:

答案 0 :(得分:5)

我建议您查看 restful_authentication 。这是Rails的事实标准auth库。

您实际上并不需要自己生成session_id ... Rails会为您处理所有这些 - 根据浏览器提供的值检查会话ID。实际上,您只需将用户ID存储在Rails会话集合中,然后检查它是否存在。

如果您不使用SSL连接,技术上很容易受到MITM攻击。

答案 1 :(得分:2)

您似乎混淆了“会话”和“登录”。 Rails中的会话对象只是一个哈希值,存储在cookie中,无论用户是否已登录,它始终存在。

在概述时,最常见的过程是将用户的ID存储在会话中。

restful_authentication插件做了很多事情。也许你发现我的Blank Rails App更有帮助,因为它可以用更少的代码做类似的事情。查看the sessions controllerlib/authentication,其中定义了与身份验证相关的控制器代码。

答案 2 :(得分:1)

试试这个网站,http://www.quarkruby.com/2007/10/21/sessions-and-cookies-in-ruby-on-rails。它似乎对该主题进行了非常全面的报道。

我的一个建议是,不仅要使用SSL,还要加密和编码(Base 64)会话和您发送的其他cookie。包含具有会话ID的随机数(随机值),以便每次发送时加密/编码版本都会更改。如果您真的担心被劫持的会话,您还可以定期重新生成会话ID以限制被劫持的cookie的暴露,尽管如果cookie不是持久性的,加密它应该会保护您。

即使您使用会话ID的查询参数而不是cookie,您也应该能够使用加密/编码的想法。