【问题标题】:MongoDB ObjectID safe for session idMongoDB ObjectID 对会话 id 安全
【发布时间】:2016-09-12 20:05:31
【问题描述】:

我正在为 Happstack 服务器制作会话系统,并使用 mongoDB 进行持久存储。我想知道 MongoDB ObjectID 是否可以安全地用作会话 ID。

【问题讨论】:

    标签: mongodb session-variables session-cookies


    【解决方案1】:

    一般来说,MongoDB ObjectIDs 是全局唯一的,因此如果您担心冲突,它是安全的。

    但是,如果您谈论的是会话 ID,那么问题实际上取决于您是否在客户端对其进行加密以及如何加密。通常,这些问题的答案应该是是并且作为对客户端不透明的加密 cookie 值。通常,您使用的任何 Web 服务器都会有实用程序来帮助解决此问题。

    同样,如果您只是想确保自己有一个唯一的 id,并且想使用对象 ID 作为来源,那很好。

    【讨论】:

    • 使用加密安全的随机值作为 ID 代替 ObjectID 不是更有意义(或者至少更快)吗?我认为一直加密和解密 ID 可能会导致一些性能问题?
    • 实际上,由于客户端永远无法访问会话 ID(只有服务器会读取它),所以它需要进行一些相当快速的加密。看看 Rails 是如何做到的。附带说明一下,如果您的会话存储由 MongoDB 之类的东西支持(同样,Rails 中的 Devise 就是一个示例),则使用 ObjectId 特别有用。
    【解决方案2】:

    MongoDB ObjectID 正好是 12 字节 [1] 长,而 Session ID 可能实现为 32 字节 [2] 长。不同之处在于,如果是 MongoDB ObjectID,攻击者更容易猜出您的 Session ID,但您的会话安全性通常不仅仅依赖于具有难以猜测的会话 ID。

    尽管如此,建议会话 ID 应至少超过 16 个字节长 [3]。在这种情况下,普通的 MongoDB ObjectID 对于会话 ID 是不安全的。

    [1]。 https://godoc.org/labix.org/v2/mgo/bson#ObjectId [2]。 https://astaxie.gitbooks.io/build-web-application-with-golang/content/en/06.2.html [3]。 https://www.owasp.org/index.php/Session_Management_Cheat_Sheet

    【讨论】:

      【解决方案3】:

      永远不要使用 MongoDB ObjectID 作为会话标识符!

      这很容易猜到,您可以接管某人的会话。您只需要等到有人登录并轻松破解他的会话 ID。

      我在这篇文章中写过此类漏洞:https://medium.com/securing/why-is-randomness-important-especially-in-the-world-of-cryptocurrencies-part-1-ebd3343c7b55

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-06-03
        • 2013-02-03
        • 2020-04-17
        • 2017-08-12
        • 2010-10-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多