我有一个非常简单的 Socket.IO 群聊系统( this one )。我想防止人们使用 JavaScript 欺骗从浏览器发送垃圾邮件新连接。这是我第一次宣传该网站时遇到的问题。
我应该采取什么措施来防止这种情况发生?我想计算来自浏览器的连接数,如果它超过阈值,我想删除所有连接。我应该使用 IP 地址吗? socket.id
对于用户来说是唯一的吗?我该怎么做?
如果您想查看 Socket.IO 代码,请参阅highlighted code here .
最佳答案
我在一款多人游戏中遇到了同样的问题,以防止用户玩多个选项卡。
客户可以通过多种方式拒绝被识别,并且可以使用多个 ID 进行登录。但由于您只想阻止用户使用同一浏览器,因此相对容易。
首先,使用passport用于身份验证和 passport.socketio将 req.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/