2

Express 3 http://notjustburritos.tumblr.com/post/22682186189/socket-io-and-express-3でこれに似た手法で良いスタートを切りました

アイデアは、socket.io 接続コールバック内からセッション オブジェクトを取得できるようにすることでありconnect-redis、この場合はセッションを保存します。

だから、app.configure私たちは持っています

var db = require('connect-redis')(express)
....
app.configure(function(){
     ....
     app.use(express.cookieParser(SITE_SECRET));                                                                                                      
     app.use(express.session({ store: new db }));                                   

そして、アプリコードには

var redis_client = require('redis').createClient()

 io.set('authorization', function(data, accept) {
     if (!data.headers.cookie) {
         return accept('Sesssion cookie required.', false)
     }

     data.cookie = require('cookie').parse(data.headers.cookie);
     /* verify the signature of the session cookie. */
     //data.cookie = require('cookie').parse(data.cookie, SITE_SECRET);
     data.sessionID = data.cookie['connect.sid']

     redis_client.get(data.sessionID, function(err, session) {
         if (err) {
             return accept('Error in session store.', false)
         } else if (!session) {
             return accept('Session not found.', false)
         }
         // success! we're authenticated with a known session.
         data.session = session
         return accept(null, true)
     })
 })

セッションは redis に保存され、キーは次のようになります。

redis 127.0.0.1:6379> KEYS *
1) "sess:lpeNPnHmQ2f442rE87Y6X28C"
2) "sess:qsWvzubzparNHNoPyNN/CdVw"

値は暗号化されていない JSON です。ここまでは順調ですね。

ただし、Cookieヘッダーには次のようなものが含まれています

{ 'connect.sid': 's:lpeNPnHmQ2f442rE87Y6X28C.obCv2x2NT05ieqkmzHnE0VZKDNnqGkcxeQAEVoeoeiU' }

したがって、SessionStore と はconnect.sid一致しません。これは、署名部分 ( の後の部分.) が SessionStore バージョンから取り除かれているためです。

質問は、Cookie の SID 部分 (lpeNPnHmQ2f442rE87Y6X28C) を切り捨ててそれに基づいて一致させるだけで安全ですか、それとも署名部分を検証する必要がありますか? もしそうなら、どのように?

4

2 に答える 2

2

Connect の utils.js のコメント行で推奨されているように、cookie-signature モジュールを使用するだけです。

var cookie = require('cookie-signature');

// クライアントからのセッション ID を "sid" という var に既に入れていると仮定します

var sid = cookies['connect.sid'];
sid = cookie.unsign(sid.slice(2),yourSecret);
if (sid == "false") {
   //cookie validation failure
   //uh oh. Handle this error
} else {
   sid = "sess:" + sid;
    //proceed to retrieve from store
}
于 2013-01-08T08:31:16.463 に答える
2

このように使用されることを意図していなかった Connect のプライベート メソッドや内部をハッキングするのではなく、この NPM は、セッションを取得し、 https://github.comsocket.onを解析および検証するメソッドをうまくラップし ます。 /functioncallback/session.socket.io

于 2012-11-08T18:38:27.643 に答える