【问题标题】:Using cookieParser() and cookieSession() together?一起使用 cookieParser() 和 cookieSession()?
【发布时间】:2013-05-04 17:25:56
【问题描述】:

cookieParser() 为我们提供了使用秘密语句签署 cookie 的选项,这对于防止篡改非常有用。我了解 cookie 使用特殊值签名,以防止篡改。

我刚刚发现了 cookieSession(),我发现它是服务器存储 cookie 的一个伟大替代品(我只存储 { loggedIn = true, userId=763487246824632},它永远不会增长)。

但是...我发现为 cookieParser() 设置“秘密”会破坏事情,并且 cookieSession() 会停止工作如果秘密句子匹配。 原因似乎是,如果 cookie 使用相同的秘密进行签名,那么 cookieParser() 实际上会接受并解析它。奇怪的是,一旦 cookieParser() 完成了它的工作,并且具有相同的签名秘密,会话被设置为:

{ cookie: 
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true } }

而不是:

{ testing: 'OOO' }

(每次重新加载都会添加一个“o”) 所以……

  • 我的分析是否正确?
  • 如果秘密句子匹配,您知道为什么会话设置为那个奇怪的{ cookie 对象吗?

佣兵。

【问题讨论】:

    标签: node.js cookies express


    【解决方案1】:

    你的分析是正确的,我可以重现。

    问题是由cookieSession 中间件中的this line 引起的(某些上下文:options.secret 是传递给cookieSession 的密钥,req.secret 是传递给cookieParser 的密钥):如果你同时传递两者中间件是一个密钥,cookieSession 假设它会在req.cookies 中找到原始(未解析的)cookie。

    但是由于cookieParser 也获取了签名cookie(并且它在cookieSession 之前运行),它已经解析了cookie 本身(并且因为签名密钥相同,它成功地这样做了),将其存储在req.signedCookies并从req.cookies中删除。所以就cookieSession 而言,cookie 没有设置。

    您看到的对象是默认会话内容(这是来自cookieSession 配置的cookie 属性):

    app.use(express.cookieSession({
      cookie : { // <-- this object
        ...
      }
    });
    

    至于解决方案:要么为每个中间件使用不同的密钥,要么只传递其中一个你的密钥,但不能同时传递两者(如果你将它传递给 cookieParserall em> 您的 cookie 将被签名)。

    FWIW:我不完全确定这是否是一个真正的错误。这是对cookieParsercookieSession 使用相同签名机制的结果,两者签名的cookie 之间没有区别。尽管可以通过始终检查 cookie 是否位于 req.signedCookies 中来修复它。

    【讨论】:

    • 多么棒的、全面的答案。我知道这是一个非常小众的问题,但值得 +1 - 谢谢!
    猜你喜欢
    • 2013-12-05
    • 2013-10-01
    • 1970-01-01
    • 2012-12-14
    • 2016-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    相关资源
    最近更新 更多