7

cookieParser()改ざんを防ぐのに最適な、秘密の文章で Cookie に署名するオプションを提供します。改ざんを防ぐために、Cookie が特別な値で署名されていることを理解しています。

cookieSession() を発見しました。これは、サーバーに保存された Cookie の優れた代替手段であることがわかりました (私は を保存するだけ{ loggedIn = true, userId=763487246824632}で、決して大きくなりません)。

しかし... cookieParser() に「秘密」を設定すると問題が発生し、秘密の文が一致すると cookieSession() が機能しなくなることがわかりました。その理由は、Cookie が同じシークレットを使用して署名されている場合、cookieParser() が実際にそれを取得して解析するためと思われます。奇妙なことに、 cookieParser() がその作業を完了し、同じ署名 secretを使用すると、セッションが次のように設定されます。

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

それよりも:

{ testing: 'OOO' }

(リロードごとに「o」が追加されます)だから...

  • 私の分析は正しかったでしょうか?
  • { cookie秘密の文章が一致すると、セッションがその奇妙なオブジェクトに設定される理由を知っていますか?

メルク。

4

1 に答える 1

15

あなたの分析は正しいです、私はそれを再現できます。

この問題は、ミドルウェアのこの行によって引き起こされcookieSessionます (いくつかのコンテキスト: options.secretis the key passed to cookieSession, req.secretis the key passed to cookieParser): 両方のミドルウェアに秘密鍵を渡すcookieSessionと、生の (解析されていない) Cookie が にあると想定されreq.cookiesます。

しかし、cookieParserは署名付き Cookie も取得したため (そして以前に実行cookieSessionされていた)、Cookie 自体を解析し (署名キーが同じだったので、解析に成功し)、 に保存し、req.signedCookies から削除しましたreq.cookies。したがってcookieSession、Cookie が設定されていないだけです。

表示されるオブジェクトは、デフォルトのセッション コンテンツ (構成のcookieプロパティcookieSession) です。

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

解決策については、ミドルウェアごとに異なるキーを使用するか、どちらか一方だけを秘密鍵に渡しますが、両方ではありません (これを に渡すとcookieParserすべての Cookie が署名されることに注意してください)。

FWIW: これが本当のバグかどうかは完全にはわかりません。これは、 と の両方に同じ署名メカニズムを使用した結果であり、どちらcookieParsercookieSessionによって署名された Cookie を区別しません。Cookie が にあるかどうかを常に確認することで修正できますがreq.signedCookies

于 2013-05-10T05:29:11.950 に答える