【问题标题】:How do i prevent players from spamming move messages (Node.js)?我如何防止玩家向移动消息发送垃圾邮件(Node.js)?
【发布时间】:2019-08-25 06:27:00
【问题描述】:

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

为了演示我目前的困境,我制作了一个一维示例,使用来自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,并限制移动。

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

谢谢

【问题讨论】:

  • 你应该只在信息变化时发送数据包。
  • 处理整个事情的一种方法是限制它们发送的数据包数量并提供 x 坐标,而不是跟踪每一个动作。如果您的阈值太低,那么除非您将运动从最后一个已知位置插入到新位置,否则运动将显得断断续续。
  • 如果您在他们自己的设备上跟踪玩家的 fps,请将该信息包含在发送到服务器的每个数据包中......永远不要试图根据数字推断或猜测他们的 fps您收到的数据包数
  • 玩家可以移动的限制永远不应基于他们的 FPS。它应该基于随时间变化的距离。不应允许拥有更多 fps 的玩家移动得更快。客户端应将移动限制在一段时间内,并且您的服务器应验证每个玩家随时间的距离移动,以确保没有恶意行为发生。
  • 玩家每帧能够移动的数量应该取决于他们的 FPS,或者位置更新的某个速率。此外,向玩家请求 FPS 来验证他们的动作是一个有问题的解决方案,并且该请求可以被拦截和更改。

标签: javascript node.js networking network-programming p5.js


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 2013-09-20
    • 2017-09-28
    • 2015-06-05
    相关资源
    最近更新 更多