You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为Deno WebSocket客户端添加自定义数值ID用于标识是否安全?

直接为WebSocket对象添加数值ID标识客户端是否安全?

这种给WebSocket对象添加服务器分配数值ID的方式,本身不存在直接的安全漏洞,但在功能实现和长期运行上有不少需要注意的问题:

核心安全层面的结论

服务器端给WebSocket对象添加的属性仅存在于服务器内存中,客户端无法直接篡改或访问这个ID,所以从"客户端伪造/篡改标识"的角度来说是安全的。

需要注意的功能隐患

  • ID重复问题:原代码用数组长度作为ID,当客户端断开连接后,数组不会自动删除对应元素,新连接会复用已断开客户端的ID,导致ID无法唯一标识当前在线的客户端,后续做客户端管理(比如定向推送消息)时会出现混淆。
  • 内存泄漏风险:数组持续存储所有连接过的WebSocket对象,即使客户端已断开,这些对象也不会被垃圾回收,长期运行会导致服务器内存占用持续增长。
  • 代码逻辑错误:原示例的message回调中直接使用n_id会导致变量未定义错误,需要通过this.n_id(普通函数回调中this指向当前WebSocket对象)来正确引用ID。

改进后的示例代码

//...
var a_o_websocket_client = [];
let nextClientId = 0; // 用自增计数器生成唯一ID

o_websocket_server.on("connection", async function (o_websocket_client) {
  console.log(`a new o_websocket_client connected: ${o_websocket_client}`);
  o_websocket_client.n_id = nextClientId++; // 分配唯一自增ID
  a_o_websocket_client.push(o_websocket_client);

  // 监听客户端断开事件,清理数组避免内存泄漏
  o_websocket_client.on("close", function() {
    const clientIndex = a_o_websocket_client.indexOf(this);
    if (clientIndex !== -1) {
      a_o_websocket_client.splice(clientIndex, 1);
    }
    console.log(`Client ${this.n_id} disconnected`);
  });

  o_websocket_client.on("message", async function(s_message){
      console.log(`this is the websocket with the id ${this.n_id}`);
  });
});
//...

内容的提问来源于stack exchange,提问作者Jonas Frey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 18:42:39