Socket.io - “套接字ID”是否被视为合理的信息?

时间:2017-06-15 13:15:20

标签: node.js sockets socket.io chat

我正在用Node.js和socket.io实现一个简单的tchat应用程序,并想知道在对象中共享所有客户端的套接字ID是否被认为是一种好习惯?

为了解释,我的每个用户都代表了:

{
    nick       : 'John Doe',
    dateJoined : Date.now(),
    rank       : 0,
    id         : socket.id
}

我所有客户的列表都存储在服务器const usersList = [ {...}, {...}, ... ]

我的所有客户都需要查看谁已连接,因此应将此usersList分享给所有客户。

如果客户端断开连接,则应通知所有人#ID已断开连接:

socket.on('userDisconnect', function(id) {
    clientSideList = clientSideList.filter( user => user.id !== id );
}

所以我的问题是:如果每个客户端都知道其他客户端的套接字ID,那么这是一个安全问题吗?他们可以制作令人讨厌的东西,例如捣乱数据或取消其他用户吗?

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

在共享一个或多个套接字的socket.id值时,没有固有的内置安全风险。 socket.io本身不包含客户端可以用来socket.id做任何事情的任何API。因此,开箱即用,如果他们知道,任何客户都无法对socket.id做任何事情。

现在,如果您开始支持接受socket.id值作为参数的socket.io消息,那么传递socket.id值确实允许某些任意客户端在您的消息中使用这些socket.id值。这是否会导致问题完全取决于您自己的设计以及服务器接受的消息。假设您支持一条消息,告诉服务器通过向用户传递socket.id来从系统中删除用户。然后,如果您开始传递socket.id值,那么任何人都可以使用您自己的服务器消息从系统中删除该用户。

因此,socket.id值没有内置风险。如果您自己的服务器支持在给定socket.id值时可能造成损坏的操作,则可能存在风险。因此,这完全取决于您如何设计服务器以及当有人知道socket.id时您是否已经防范恶意操作。

您可以将socket.id视为socket.io服务器上的临时用户名。在大多数系统中,仅知道某个用户的用户名本身不会导致安全问题。只有当您公开操作时,未经授权的客户端才能指向您遇到问题的特定用户名。 socket.id也是如此。它就像一个临时用户名。