【问题标题】:Is socket.id unique over time, should it be kept private?socket.id 随着时间的推移是唯一的,它应该保密吗?
【发布时间】:2021-09-11 23:49:15
【问题描述】:

我正在为(大小有限的)gamejam 编写游戏。

我想创建一个排行榜,存储条目的最简单方法是基于玩家的 socket.id。

我这样做是否安全,或者将来是否有机会再次将其提供给玩家?

另外,我应该保密还是将其作为排行榜的一部分发送给客户是否安全? (即随机玩家可以使用此 ID 干扰具有排行榜 ID 的合法玩家吗?)

【问题讨论】:

  • 来自documentation“[A] 套接字会话的唯一标识符。在connect事件触发后设置,reconnect事件后更新。”.
  • 谢谢,但它有多独特?对于服务器的生命周期?本地到机器(即从进程ID等派生)?普遍吗?
  • @GaborHeja 套接字会话的生命周期,通常每个客户端。不记得 Socket.io 是否有一个“粘性”选项来跨会话保留 ID,但除非您使用某种形式的持久存储,否则对于您的用例来说,这是一个相当不可靠的选项

标签: javascript node.js socket.io


【解决方案1】:

socket.id 仅在给定的 socket.io 会话期间持续。来自同一客户端的未来 socket.io 连接将被赋予一个新的socket.id。因此,它不是一个持久的标识符,因此我认为它对于排行榜不会非常有用,因为它不一定将来自同一用户(在不同会话中)的多个分数归因于同一用户。相反,您需要您自己的服务器创建的持久用户标识符(通常作为用户注册/登录过程的一部分),并且可以长期确保它是唯一的,并且同一客户端每次都获得相同的标识符。

至于socket.id 的独特性,它是通过随机数生成创造出来的。它使用模块 base64id 创建唯一 id,doc for that module 表示它使用crypto.randomBytes()。可以看到实现here

因此,通过随机数生成,它在概率上是唯一的,而不是保证唯一。 乍一看 base64id 模块,它似乎在某些情况下将一个递增的数字附加到随机字节,这可以保证它在服务器生命周期内是唯一的(无需重新启动服务器),假设不会翻转增加的数字,但仍然不会在不同会话中为同一个客户端保持相同的 id。

是否应该保密

socket.id 在服务器上创建/分配,因此客户端无法尝试欺骗或使用其他用户的 socket.id。因此,没有特别的理由将其保密。 它只是 socket.io 用于内部簿记以跟踪给定连接状态的唯一 ID。

如果您曾经查看过 socket.id,那么它并不是专门供人类使用和/或在 UI 中显示的。它是一个 base64 字符串,如果显示在排行榜中,对于大多数普通用户来说,它看起来很像胡言乱语。更常见的是,用户在注册您的服务时会指定他们自己的“显示名称”,您会在排行榜中使用该名称,并将其用作从一个会话到下一个会话的持久标识符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 2017-07-29
    • 2011-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多