【问题标题】:Socket.io ID and user info securitySocket.io ID 和用户信息安全
【发布时间】:2019-01-16 00:51:21
【问题描述】:

我现在想做的是当用户离开大厅时,我想发出离开大厅的用户名,然后在大厅聊天室中显示该信息。这是当前的发射:

  $("#lobby-leave-btn").on('click', () => {
    socket.emit('lobby-left', {
      username: username
    });
  });

问题是每个人都可以在控制台中设置他们想要的任何用户名,即使我在服务器端检查该用户名是否存在于数据库中,他们也可以键入不在大厅中的现有用户用户名。

有没有办法在不传递用户名的情况下做到这一点?更安全的方式?我可以在服务器端获得socket.id,但我又无法通过套接字 id 获取用户信息。任何帮助表示赞赏。

【问题讨论】:

  • 为什么不检查他们在尝试连接时输入的用户名?
  • 连接哪里?
  • 连接到套接字?

标签: node.js socket.io


【解决方案1】:

如果您有用户名,那么您应该将它们存储在服务器端,我假设您正在这样做(在数据库中,或者在用户连接时存储在服务器的内存中)。在这种情况下,一旦你知道用户是谁——也就是说,只要他们登录(如果你有登录系统)或连接到套接字——你应该将用户名存储为属性在服务器上的套接字本身上。然后任何传入的套接字数据都会自动附加用户名,因为它固有地连接到该套接字。

网络安全的信条是,如果您能提供帮助,您永远不应该信任用户提交的数据;所以你不应该让用户在没有某种验证的情况下在操作中识别自己。因此,在登录或连接时验证他们一次,然后将他们的身份存储在套接字上,不要让他们在想要进行更改时告诉你他们是谁。

【讨论】:

  • 是的,我也有这个想法。但是我应该从登录存储信息到变量?然后我可以轻松地使用用户信息重用相同的变量?
  • 就像我说的,最好将标识信息(如用户名)作为属性存储在服务器上的套接字对象本身上。这样,来自套接字连接的所有数据将自动识别谁在发送它(因为您始终知道哪个套接字正在接收数据,并且用户信息在该套接字上),并且当套接字关闭时,该数据将随之销毁,所以没有人可以继续冒充他们。 (在我自己的应用程序中,我也使用了令牌系统,但这对于您的目的来说并不是完全必要的。)
  • 我应该如何将信息准确地分配给套接字参数?
  • socket 最终只是一个 Javascript 对象;你可以像任何其他对象一样添加任何你想要的参数。因此,例如,如果您的套接字变量名为sock,您只需执行sock.socketUsername = "abraom_185",然后您就可以通过访问sock.socketUsername 来获取用户名。 (当然,不要对名称进行硬编码;在用户登录或连接时从用户那里获取,或者他们第一次提供用户名。)
  • io.on('connection', (socket) => { 所以我可以将信息分配给这个socket 参数?我在登录套接字中做了这个socket.socketUsername = data.username;(我得到了用户名),但是当我想在另一个套接字中重用它时,我得到了undefined
猜你喜欢
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
  • 2017-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多