【问题标题】:Should session ID cookie be signed?会话 ID cookie 是否应该被签名?
【发布时间】:2015-05-02 10:10:01
【问题描述】:

我使用 Node 库 https://github.com/expressjs/session 并注意到它需要指定一个秘密来签署会话 ID cookie。

如果只是将会话 ID 存储在 cookie 中,而不是任何数据,那么签署 cookie 有什么用?

我的理由是,如果有人想修改会话 ID cookie,那么如果会话 ID 足够长以防止暴力攻击,那就没问题了。我错过了什么吗?

【问题讨论】:

  • 这可能会有所帮助:stackoverflow.com/a/3240420/406249
  • @NicolasMcCurdy 谢谢!读起来很有趣,但这个问题似乎与包含数据的会话 cookie 有关,因此不需要服务器端存储。为此需要一个签名的 cookie 是有道理的,但在我的情况下,cookie 只是存储在服务器上的数据的标识符,因此它不容易出现同样的问题。
  • 也许是为了防止其他人在用户浏览器中创建虚假会话cookie(通过XSS或类似的东西)。

标签: node.js session-cookies


【解决方案1】:

我也对此提出了质疑,我能想到的唯一答案是,

  • a) 如果有人(没有正当理由?)更改了默认会话 ID 生成到非加密随机会话 ID,对其进行签名 有助于防止攻击者生成有效的会话 ID。
  • b) 通过验证会话来减少会话存储的往返次数 使用签名/HMAC 的 ID。 (我只能想象这是一个问题 用于 DoS 攻击)。

这两个似乎都是正当的理由,尽管使用良好的会话缓存会否定 b) 的需要,并且假设您的库的用户足够愚蠢来更改默认会话 ID 生成,这似乎有点保护他们自己的愚蠢,当大多数用户只会使用默认的生成算法。

【讨论】:

    【解决方案2】:

    如果您只存储会话 ID,则没有理由对其进行加密。你说的对。 如果您将一些会话数据存储在 cookie 中,则需要加密,而不仅仅是 id。 这将防止用户更改会话数据。

    【讨论】:

    • OP 询问的是对 cookie 进行签名,而不是对其进行加密。
    【解决方案3】:

    session_id cookie 是向服务器标识客户端的任何内容(数字或字母数字),服务器反过来将(通常是临时的)数据存储在通过此 session_id/key 访问的服务器上。

    关键是,如果 cookie 将通过 HTTP 来回传递,那么无论您是否“签名”它都无关紧要。任何中间人都可以获得您的“签名/加密的 session_id”,并假装是正确的用户提出进一步的请求。我的意思是,这个攻击者不必关心加密数据中包含哪些信息,他可以传递完全相同的签名/加密数据,而服务器无法确定它是否真的来自正确的用户。

    在这种情况下,你必须弄清楚隐私是否重要,如果是,不要想太多,你必须使用 HTTPS。如果您了解它不是那么重要,请不要浪费您的“处理时间”来签名/加密和解密您的会话 ID。

    此答案仅对已签名的 session_id 有效。

    【讨论】:

      【解决方案4】:

      我相信它被签名的原因是它不容易被猜到。例如,如果有人决定使用整数作为会话 ID,您可以通过尝试多个数字来轻松模拟另一个用户的会话。我相信签名使得更改您的会话 id 值客户端将无效(即它可以防止篡改)。

      【讨论】:

        猜你喜欢
        • 2018-11-06
        • 2011-10-10
        • 2016-01-23
        • 1970-01-01
        • 2019-09-29
        • 1970-01-01
        • 2010-12-29
        • 2013-08-29
        • 2013-01-29
        相关资源
        最近更新 更多