我正在第一次通过滚动我自己的身份验证和会话,我不确定我是否理解现有的会话支持.(首先,我的意思是我最初通过http进行身份验证,而不是https.生产代码将使用https.)
我对安全会话的理解是,您通过SSL上的cookie将令牌传递给浏览器,然后将该令牌与存储在服务器上的令牌进行比较,看看它是否真的是您认为的用户.我希望你们能够检查我对安全会话的理解,具体如下:
用户获取登录页面并提交登录名和密码(通过SSL POST).
服务器检查协议,然后检查密码sha1(通常为+ salt)与db中的现有哈希.如果它们匹配,则生成会话ID,将其放在具有用户标识的(n SSL)cookie中以及服务器端会话存储中.将用户重定向到站点的安全区域.
该会话ID在整个用户的登录会话中保持不变 - 或者 - 服务器在每次安全操作后发出新的会话ID,通过SSL cookie发送它并将新值存储在db中.
涉及私有或安全数据的任何操作都会检查会话存储是否存在此用户的会话ID,如果存在,则在执行操作之前将cookie的session_id与会话存储进行比较.如果我们正在轮换会话ID,请在操作后发出新的会话ID(SSL cookie和服务器端存储).
用户注销,告诉服务器从会话存储中删除会话ID并清除cookie.或者cookie在浏览器和/或服务器上到期,并且需要重新认证.
上面有什么明显的错误吗?此外,如果cookie中的令牌仅仅是会话ID,Rails的session []支持似乎不会阻止MITM攻击.那是对的吗?
我建议看一下restful_authentication.这是Rails的事实标准auth库.
您实际上并不需要自己生成session_id ... Rails会为您处理所有这些 - 根据浏览器提供的值检查会话ID.实际上,您只需将用户ID存储在Rails会话集合中,然后检查它是否存在.
如果不使用SSL连接,技术上很容易受到MITM攻击.