代码之家  ›  专栏  ›  技术社区  ›  Ben

如何防止Rails用户意外地验证为错误的用户?

  •  3
  • Ben  · 技术社区  · 15 年前

    具体来说,我已经编写了一个Rails应用程序,其中使用了默认值(在Rails 2.3.5中) CookieStore session store和我发现了开发中的一个奇怪问题。

    session 对象(因此,在浏览器和服务器之间来回传递的cookie中)。

    今天我重置了数据库,删除了所有用户记录(以及所有其他数据)。有几个用户重新开始注册,然后有一个用户发现,他们第一次去网站,因为擦拭他们自动登录为一个不同的用户!

    我想我可以理解为什么会发生这种情况:从该用户浏览器传递到服务器的用户ID现在与我数据库中的另一个用户记录匹配。我最初的想法是“哦,天哪,我没想到会这样!”但我越想越意识到这可能是预期的行为。

    我意识到我可以将我的Rails应用程序更改为用户 ActiveRecordStore 库克商店 会话和让会话保持活动一段时间真的会造成这样一个巨大的安全漏洞?还是我遗漏了什么?如果 session_id 在这里提供更多的安全?

    5 回复  |  直到 15 年前
        1
  •  1
  •   NZKoz    15 年前

    解决这个问题的最简单方法是在重置数据库时更改cookie名称。cookie名称应该在config/initializers/session\u store.rb中

    ActionController::Base.session = {
      :key         => '_your_app_session_v2',
    

    您也可以更改机密,但如果用户使用旧cookie请求站点,则可能会产生错误。

        2
  •  4
  •   Jaime Bellmyer    15 年前

    如果要滚动自己的身份验证,请改为尝试此操作:将“token”字符串字段添加到用户表中。当有人登录时,将此令牌设置为一组随机的数字和字母,然后传递 那个

    现在当一个用户访问一个页面时,他们的帐户被这个散列而不是他们的用户id查找,其值是这个散列很难猜测,而且永远不会重复。当你重置数据库时,你的用户id实际上是重复的,这导致人们以对方的身份登录。

    更新

    @shingara说的对,cookie商店已经处理了安全部分,我错了。因此,用户id混淆是一次性的,因为您重置了数据库。除非再次重置数据库,否则在生产环境中不会遇到此问题。如果重置是 有可能,然后仍然按照我的建议创建令牌。否则,你就没事了。

        3
  •  0
  •   shingara    15 年前

    另一种情况是,您可以添加会话,即用户使用唯一密钥的哈希值。当您检查会话时,您将获得用户id并检查用户令牌是否相同。如果没有,则用户未经授权。

        4
  •  0
  •   Ben    15 年前

    谢谢你的回复。他们都以某种方式回答了我的问题:是的,我的设置(以及在清除用户之后不设置新的会话密钥)创建了一个安全漏洞。

    很多Rails教程都支持这种设置,但没有提到这样一个事实,即您只需要将cookie作为另一个用户进行完全身份验证。

    总之,我问这个问题是因为我找不到任何东西来讨论 CookieStore 会话+长cookie生存期 ,我觉得很奇怪,所以我想我可能遗漏了一些显而易见的东西。