2017-08-03 6 views
1

私の質問は、express-handlebarsで表示するために送信するものです。 このチャットアプリでは、ユーザー名はHTMLコードでアクセスでき、変更可能です。誰かがh4タグ(John DoeからDoe Johnまで)の内容であるユーザー名を変更すると、それはすべてのクライアントに影響します。また、セッションを保存するためにexpress-sessionとmongostoreを使用していますが、reqなしでアクセスセッションを行うことはできません。だからこの問題を解決するためのあなたのオファーは何ですか?(セッションへのアクセス)事前に感謝します。サーバ側ソケットからのエクスプレスセッションにアクセスする

function socket(io) { 

    io.on('connection', function(socket) { 
     socket.on('chat message', function(msg) { 
      console.log(splitUsername[0]);*/ 
      io.emit('chat message', msg); 
     }); 
    }); 
} 

module.exports = socket; 
+1

https://github.com/christopheranderson/express-session-socket.io – robertklep

答えて

2

がクライアントに(店舗重要な変数のサーバ側、代わりのクライアントに依存する)

を決して信用しないでください。■クライアント側

<h4 id="username">{{username}}</h4> 
    <div class="chat"> 
     <ul class="chat-box"></ul> 
    </div> 
    <div class="chat-user"> 
     <form io="form-chat" class="form-inline"> 
     <div class="form-group"> 
      <input type="text" class="form-controll" id="text-chat" name="text-chat" value=""> 
     </div> 
     <button>send`enter code here`</button> 
     </form> 

簡易確認chatを使用する前に、ユーザー名)のプロトコルを選択してください。

const _onlineUsernames = {}; 
const MAX_USERNAME_LENGTH = 16; 
io.on('connection', function(socket) { 
//.: Login (Pick Username) 
socket.on('enter',function(username){ 
    if(username){ //did we really receive a username? 
    if(username.length!=0 && username.length<=MAX_USERNAME_LENGTH){ 
    if(!_onlineUsernames[username]){ 
    //username not in use, add to online list & verify : 
    _onlineUsernames[username] = {sid:socket.id}; 
    socket.chat_verified = true; //used to verify username has been picked 
    socket.chat_username = username; //store in the socket 
    }else{socket.emit('error', 'username currently in use');} 
    }else{socket.emit('error', 'length of username supplied');} 
    }else{socket.emit('error', 'no username supplied');} 
}); 
//.: Chat Logic 
socket.on('chat message', function(msg) { 
    if(socket.chat_verified){ // Check if the user is verified (previously picked username) 
    console.log(socket.chat_username); 
    // Here, I would do some escaping/sanitation before emiting the message, 
    // mainly to prevent client-to-client injection (sanitation/escaping can be done in the client-side instead) 
    io.emit('chat message', msg); 
    }else{ socket.emit('error', 'chat_verification_required'); } 
}); 
//.: Login (Pick Username) 
socket.on('disconnect',function(){ 
    // Check if disconnected user was verified (picked username) 
    if(socket.chat_verified){ delete _onlineUsernames[socket.chat_username]; }//username is free to be used again 
}); 
}); 

彼らは、ユーザー名を確認するまで、クライアントはチャットを使用することができません(ソケットがイベントを「入力」)

あなたがセキュリティに不安がある場合、あなたはまたのメッセージをエスケープ/サニタイズすべきですクライアント。 次のメッセージを送信するクライアント(<script>alert('injected js!);</script>


EDIT:(質問は、具体的には約ソケットからセッションにアクセス依頼)

Expressを露出するexpress-session-socket.ioミドルウェアを使用socket.io内のセッションオブジェクト(ソケット内にユーザー名を格納したのと同様)

コード例:単純な(あなたはおそらくすでにセッションストアが定義されているので)

io.use(require('express-session-socket.io')(sessionStore, 'secret', function (err, session, socket, next) { 
    if (err) next(err); 
    socket.session = session; 
    next(); 
})); 
関連する問題