如何防止玩家发送移动消息(Node.js)?



本质上,我想了解行业标准,以及防止玩家向移动数据包发送垃圾邮件的正确做法。

为了证明我目前的困境,我做了一个一维的例子,使用了除插值之外 https://www.gabrielgambetta.com/client-server-game-architecture.html 的关键概念。因此,我的移动消息由方向(-1 或 1)和客户端时间戳(用于对账)组成。

// Client move function, dir = -1 or 1
function move (dir, dt) {
localxPos += dir;
last_ts_local = Date.now();
socket.emit('move', {
ts: last_ts_local,
dir: dir
});
}

由于服务器只是将每个移动数据包的方向添加到玩家位置,因此可以发送一系列移动消息以加快移动速度。

...
// Server receive move
socket.on('move', function(msg) {
clients[socket.id].process_queue_moves.push(msg);
});
...
// Server processes movement queue (run every 1 seconds - very slow for example purposes)
for (var i = 0; i < clientIDs.length; i++) {
clientID = clientIDs[i];
// process movement queue
for (var j = 0; j < clients[clientID].process_queue_moves.length; j++) {
clients[clientID].xPos += (clients[clientID].process_queue_moves[j].dir)/Math.abs(clients[clientID].process_queue_moves[j].dir);
}
if (clients[clientID].process_queue_moves.length > 0) {
clients[clientID].last_ts = clients[clientID].process_queue_moves[clients[clientID].process_queue_moves.length-1].ts;
} else {
clients[clientID].last_ts == -1;
}
// clear movement queue
clients[clientID].process_queue_moves = [];
}

我最初认为我可以根据客户端的帧速率或数据包速率来计算它们发送的数据包数量。但是,我很快意识到,如果客户端发送 2 个数据包,这并不意味着它们有 2 个 FPS。他们可以简单地静止不动,并移动 2 帧。

在意识到这一点之后,我发现即使播放器不移动,我也可以发送移动数据包 - 更像是一个输入数据包。这样,客户端可以在不移动时发送方向为 0 的移动消息。

这消除了玩家的恶意潜力,因为如果玩家发送 1000 个数据包,服务器可以推断玩家只有 1000 FPS,并限制移动本身。

现在,我不确定这是否是处理此问题的最佳方法,或者是否每帧发送一条消息过于密集。如果有更好的方法可以做到这一点,请您告诉我:)。

谢谢

我已经通过发送输入片段来解决这个问题(为了降低数据包 - 我有 20 tps)。输入数据包还包含玩家不移动以执行准确验证的时间。如果您想了解有关我如何解决此问题的更多信息,请:)我。

最新更新