USERINFO_UPDATE: construct a new message for broadcast

The server was reusing the client's message when broadcasting userinfo
updates. This would allow a malicious client to insert arbitrary fields
into a message that the other clients would trust as coming from the
server. For example, adding "disconnect" or renaming other authors.

This commit fixes it by having the server construct a new message with
known fields before broadcasting.
This commit is contained in:
Richard Braakman 2012-10-02 23:27:30 +03:00
parent 2cf46d3964
commit 85b44119ae
1 changed files with 18 additions and 6 deletions

View File

@ -416,21 +416,33 @@ function handleUserInfoUpdate(client, message)
var padId = sessioninfos[client.id].padId; var padId = sessioninfos[client.id].padId;
//set a null name, when there is no name set. cause the client wants it null var infoMsg = {
if(message.data.userInfo.name == null) type: "COLLABROOM",
{ data: {
message.data.userInfo.name = null; // The Client doesn't know about USERINFO_UPDATE, use USER_NEWINFO
type: "USER_NEWINFO",
userInfo: {
userId: author,
name: message.data.userInfo.name,
colorId: message.data.userInfo.colorId,
userAgent: "Anonymous",
ip: "127.0.0.1",
} }
}
};
//The Client don't know about a USERINFO_UPDATE, it can handle only new user_newinfo, so change the message type //set a null name, when there is no name set. cause the client wants it null
message.data.type = "USER_NEWINFO"; if(infoMsg.data.userInfo.name == null)
{
infoMsg.data.userInfo.name = null;
}
//Send the other clients on the pad the update message //Send the other clients on the pad the update message
for(var i in pad2sessions[padId]) for(var i in pad2sessions[padId])
{ {
if(pad2sessions[padId][i] != client.id) if(pad2sessions[padId][i] != client.id)
{ {
socketio.sockets.sockets[pad2sessions[padId][i]].json.send(message); socketio.sockets.sockets[pad2sessions[padId][i]].json.send(infoMsg);
} }
} }
} }