がクライアントに(店舗重要な変数のサーバ側、代わりのクライアントに依存する)
を決して信用しないでください。■クライアント側
<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();
}));
出典
2017-08-03 18:00:30
EMX
https://github.com/christopheranderson/express-session-socket.io – robertklep