为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
相关产品推荐
相关产品推荐

