Socket.io - “套接字 ID”是否被视为敏感信息?

jmp*_*mpp 2 sockets chat node.js socket.io

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

为了解释一下,我的每个用户都是这样表示的:

{
    nick       : 'John Doe',
    dateJoined : Date.now(),
    rank       : 0,
    id         : socket.id
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

socket.on('userDisconnect', function(id) {
    clientSideList = clientSideList.filter( user => user.id !== id );
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:如果每个客户端都知道其他客户端的套接字 ID,这是否会出现安全问题?他们会做出一些令人讨厌的事情,比如窃取数据或冒充其他用户吗?

感谢您的帮助

jfr*_*d00 7

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

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

因此,价值观不存在内在风险socket.id。如果您自己的服务器支持在给定 socket.id 值时可能造成损害的操作,则可能存在风险。因此,这完全取决于您如何设计服务器以及当有人知道socket.id.

您可以将 socket.id 视为 socket.io 服务器上的临时用户名。在大多数系统中,仅知道某个用户的用户名本身并不会导致安全问题。只有当您暴露未经授权的客户端可以直接针对特定用户名的操作时,您才会遇到问题。对于 也一样socket.id。它就像一个临时用户名。