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

标签 node.js express socket.io spam-prevention rate-limiting

我有一个非常简单的 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/

相关文章:

node.js - react native Node 依赖项安装破坏了项目

node.js - 手动更改路由后 mediator.user 丢失

mysql - 获取列数据并插入到另一列中给出的 id 的行中 - sql nodejs

node.js - 更改 grunt (express)/protractor 调试端口

node.js - 使用 socketio 心跳的优点/缺点

使用typeof后node.js变量未定义错误

mysql - JSON.stringify 字符串是否可以防止 (My)SQL 注入(inject)?

javascript - 书架JS : How to define relationship with a foreign key other than ID

node.js - 如何使用 aws lambda(无服务器架构)开发类似套接字的方法

html - 使用 Handlebars 循环 n 次