在socket.io服务器的配置中,我有以下代码,它从标题中的cookie中获取会话ID,我想验证该会话是否与登录用户相对应(我使用express作为http服务器,以及用于存储会话的MemoryStore。)
io.set('authorization', function (handshakeData, callback) {
var cookies = handshakeData.headers.cookie;
cookies = connect.utils.parseCookie(cookies);
var sid = cookies['connect.sid'];
/* verify that is a valid session */
});
当我从Firefox连接到我的node.js时最终使用长轮询,但是当我从使用WebSockets的Chrome连接时失败。它不起作用的原因是当客户端代码连接到套接字时,Chrome根本不会在标头中发送cookie。
有没有让Chrome通过WebSockets发送cookie?
如果不是,我应该如何存储sessionID,以便在验证套接字连接时可以访问它?
我还应该注意保持会话ID的cookie设置为http-only,我在其他地方看到的可能是问题?我的理解是,删除该选项会增加您对XSS攻击的脆弱性吗?
感谢您的帮助!
答案 0 :(得分:0)
不熟悉Chrome的特定行为。但是,很难保证你会得到像Flash套接字这样的cookie,而socket.io可能会依赖它。
但是,当您使用https://github.com/carhartl/jquery-cookie之类的连接或仅通过javascript(例如document.cookie)访问cookie时,您可以使用socket.io手动通过wire.io手动发送会话ID。不管运输方式如何,你都可以保证这样。
答案 1 :(得分:0)
尝试在客户端上禁用闪存套接字和网络套接字:
var socket = new io.Socket(null, {
rememberTransport: false,
transports: [
//'websocket',
//'flashsocket',
'htmlfile',
'xhr-multipart',
'xhr-polling']
})
socket.on('connect',
function() {
console.log(arguments);
}
);
socket.on('message',
function(data) {
console.log(arguments);
}
);