簡體   English   中英

如何阻止玩家發送垃圾郵件移動消息(Node.js)?

[英]How do i prevent players from spamming move messages (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)。 輸入數據包還包含播放器未移動以執行准確驗證的時間。 如果你想知道我如何解決這個問題的更多信息,請告訴我:)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM