是否可以通过没有护照的会话来验证用户套接字?它对我有用,但是安全吗?

时间:2019-05-03 15:05:08

标签: javascript express security session socket.io

我试图在堆栈溢出时找到有关此问题的答案,但找不到任何有用的方法。因此,在所有示例中,我发现它们使用护照中间件。 我正在使用Express-Session中间件对会话进行验证。

据我了解,会话中间件使用提供某种HMAC的秘密。因此,它不能被伪造或修改。所以如果我做这样简单的事情

app.use((req, res, next) => {
    if(!req.session) return next();
    *if(req.session.userId){
        getDb().collection('users').findOne({_id: req.session.userId})
        .then(user=>{
            if(!user) return next();
            req.userId = req.session.userId;
            next();
        })
    }*else{
        next(); 
    }
});
/*
Then this 'if(!user) next()' is not required because my backend would 
always put right id of a user in session, and it can't be modified on client. 
I've put it here because it could happen that user gets deleted while session exists.
*/

所以现在回到socket.io。我发现express和socket之间没有连接,所以我无法轻易获得req.session。有包叫 我安装了“ express-socket.io-session”,以便能够访问每个套接字上的会话。现在,我在路由/ chat上每个已连接套接字上的登录/身份验证(仅对经过身份验证的用户可用)看起来像在每个快速路由上一样,但它位于io.listener中。就像这样:

//Session access: socket.handshake.session
module.exports = async function(socket){ //This is mounted on io.on('connection')
    if(socket.handshake.session){
        //Login user with the session
        const user = await getDb().collection('users').findOne({_id:socket.handshake.session.userId});
        if(!user){ 
            /*If somehow there is no user found in db from session then 
             disconnect socket and send it to client*/
             return socket.disconnect();
        }
        //If user with same username is connected. Disconnect other user
        if(user.username in connectedUsers){
            const socketId = connectedUsers[user.username].socketId;
            io.sockets.connected[socketId].disconnect();
            delete connectedUsers[user.username];
        }
        connectedUsers[user.username] = {...user, socketId: socket.id}; //I DONT EXPOSE FULL USER OBJECT TO CLIENT! (only username and similar info)
        //Inform all users 
        io.sockets.emit(UPDATE_USERS, updateUsers(connectedUsers));
/*
Again updateUsers function doesn't expose full user object just count of 
users and array of usernames...
*/



//MORE CODE LIKE THIS...

如果您不想阅读完整的代码,这就是我没有做的事情

  1. 我的会话有一个秘密(不能伪造或修改?) 表达会话。

  2. 我从套接字上不会发出任何危险的信息,例如用户ID或哈希密码,用户名,profile_pic等。

  3. 只有当另一个用户通过访问该用户的计算机从另一个用户窃取了session.sid时,我的应用程序才可能被利用。哪一个 可以理解。

那么我的方法中是否存在泄漏?我会遇到什么问题?

0 个答案:

没有答案