gpt4 book ai didi

node.js - 如何使用 Socket.IO 强制限制一个用户的最大连接数?

转载 作者:太空宇宙 更新时间:2023-11-03 22:35:42 24 4
gpt4 key购买 nike

我有一个非常简单的 Socket.IO 群聊系统( this one )。我想防止人们使用 JavaScript 欺骗从浏览器发送垃圾邮件新连接。这是我第一次宣传该网站时遇到的问题。

我应该采取什么措施来防止这种情况发生?我想计算来自浏览器的连接数,如果它超过阈值,我想删除所有连接。我应该使用 IP 地址吗? socket.id 对于用户来说是唯一的吗?我该怎么做?

如果您想查看 Socket.IO 代码,请参阅highlighted code here .

最佳答案

我在一款多人游戏中遇到了同样的问题,以防止用户玩多个选项卡。

客户可以通过多种方式拒绝被识别,并且可以使用多个 ID 进行登录。但由于您只想阻止用户使用同一浏览器,因此相对容易。

首先,使用passport用于身份验证和 passport.socketioreq.user 从 Express 中间件“桥接”到 socket.request.user

接下来,由于 io.on('connection') 始终会针对来自客户端的最新套接字请求而触发,因此您可以利用此机会来“终止”仍然连接的任何旧套接字同一个客户。这就是 socket.request.user 可以派上用场来识别是否是同一个用户客户端的地方。像这样的事情:

io.on('connection', function(socket) {
var user = socket.request.user;

// Suppose this user has connected from another tab,
// then the socket.id from current tab will be
// different from [see *1]

var current_socket_id = socket.id;
var last_socket_id = user.latest_socket_id;

if (last_socket_id) {
// If the user has an existing socket connection
// from the previously opened tab,

// Send disconnection request to the previous socket
io.to(last_socket_id).emit('disconnect');
// client-side will look like
// socket.on('disconnect', function(){
// alert('You connected from a new tab, this tab will close now.')
// window.close();
// });
}

// [*1] current socket.id is stored in the user
user.latest_socket_id = socket.id;
user.save();
});

关于node.js - 如何使用 Socket.IO 强制限制一个用户的最大连接数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29726444/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com