2012-11-08 83 views
2

我有类似这样的快递3 http://notjustburritos.tumblr.com/post/22682186189/socket-io-and-express-3匹配和socket.io连接

的想法是,让我从内抢会话对象的技术,一个良好的开端验证快递3/2连接会话密钥一个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。到现在为止还挺好。

的饼干头,但是,包含有类似

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

所以现在SessionStore和connect.sid不匹配,因为签名部分(.后)从SessionStore版本剥离。

问题是,只是截断cookie的SID部分(lpeNPnHmQ2f442rE87Y6X28C)并基于该匹配进行匹配是安全的,还是应验证签名部分?如果是这样,怎么样?

回答

2

,而不是私人的方法和连接的内部,这不意味着要使用这种办法解决黑客攻击,这NPM确实在会话拉的方法包装socket.on一个良好的工作,并解析和验证 https://github.com/functioncallback/session.socket.io

+0

这也看起来不错变种。似乎是优雅..我不知道它是否有任何缺点与只是将商店变量传递给socket.io并执行查找时,你想? – CommaToast

2

只需使用cookie-signature模块,就像Connect的utils.js中的注释行所推荐的那样。

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

//假设你已经把会话ID从客户端在一个名为“SID”

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 
}