我正在第一次通过滚动我自己的身份验证和会话,我不确定我是否理解现有的会话支持。 (通过第一遍,我的意思是我最初通过http进行身份验证,而不是https。生产代码将使用https。)
我对安全会话的理解是您通过SSL上的cookie将令牌传递给浏览器,然后将该令牌与存储在服务器上的令牌进行比较,看看它是否真的是您认为的用户。我希望你们能够检查我对安全会话的理解,具体如下:
以上是否有任何明显的错误?此外,如果cookie中的令牌仅仅是会话ID,Rails的session []支持似乎不会阻止MITM攻击。这是对的吗?
答案 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 controller和lib/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,您也应该能够使用加密/编码的想法。