我正在用Node.js和socket.io实现一个简单的聊天应用程序,想知道是否在整个对象中共享所有客户端的套接字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,那是否是一个安全问题?他们会做出令人讨厌的事情,例如窃取数据或冒充其他用户吗?
感谢您的帮助
共享一个或多个套接字的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
相同。就像一个临时用户名。