создание античита в онлайн-игре

#javascript #node.js #express #security

Вопрос:

У меня есть простой веб-сайт с небольшой игрой на нем. В нем есть базовое табло с использованием express — каждый раз, когда вы умираете, веб-сайт отправляет запрос на публикацию на сервер с вашим счетом, и сервер добавляет его в таблицу лидеров. Моя проблема в том, что использовать таблицу лидеров очень просто. с помощью devtools люди могут легко просто:

  • отключите коллайдеры, чтобы они не могли умереть, а затем включите их снова, когда они будут довольны результатом
  • прямо сейчас просто установите оценку на то, что они хотят
  • используйте консоль, чтобы отправить собственный запрос на публикацию с оценкой по своему выбору

Я думал о создании счетчика очков на стороне сервера и средства проверки столкновений, но моя игра быстро развивается, поэтому я думаю, что это будет проблематично, не говоря уже о вычислительной мощности, которую он разместит на сервере, если несколько человек будут играть одновременно.

Действительно ли это единственное решение или есть более простые решения, о которых я не думаю?

код сервера:

 const express = require('express'); const app = express(); const fs = require('fs');  const { json } = require('express');  app.use(express.json()); app.use(express.urlencoded({extended:true})); app.use(express.static('Build'))  app.get('/leaderBoard', (req,res)=gt;{  var rawData = fs.readFileSync('./database.json');  var data = JSON.parse(rawData);  res.json(data); })  app.post('/leaderBoard', (req, res)=gt;{  var rawData = fs.readFileSync('./database.json');  var leaderBoard = JSON.parse(rawData).leaderBoard;   for(var i = 0; i lt; leaderBoard.length; i  ){  if(req.body.score gt; leaderBoard[i].score){  for(let i2 = leaderBoard.length -1; i2 gt; i; i2--)  leaderBoard[i2] = leaderBoard[i2-1];    leaderBoard[i] = req.body;  break;  }  }   fs.writeFileSync("./database.json",JSON.stringify({leaderBoard},null,2)); })  app.listen(process.env.PORT || 3000);  

Комментарии:

1. Вы должны попытаться переместить как можно больше на сторону сервера (не делая игру неиграбельной при слегка высоком пинге). Вероятно, было бы лучше использовать базу данных, отличную от json, чтобы она лучше работала с большим количеством игроков.

2. Вместо того, чтобы читать ваш database.json файл каждый раз, когда кто-то делает запрос, прочитайте его при запуске сервера и сохраните в переменной. Это займет больше памяти, но для возврата запроса потребуется меньше времени. Что касается анти-чита, любое количество мер по предотвращению мошенничества отпугнет мошенников, но всегда найдутся несколько надоедливых, которые сделают все возможное, чтобы перепроектировать как можно больше и найти способ обойти его. Чтобы предотвратить это, было бы лучше иметь как можно больше серверной части. Имея в виду эти 2 стороны, хорошо найти хороший баланс.

Ответ №1:

Проверка на стороне сервера была бы необходима, если вы действительно хотите избежать любого мошенничества… НО вы всегда можете усложнить мошенничество на стороне клиента с помощью простых проверок, таких как определение максимального изменения очков (например, если кто-то набирает более 100 очков за 1 секунду, значит, он мошенничает).

Использование уменьшенного кода не повредит, и вы также можете заменить имена переменных абстрактными (a, b, c вместо «оценка»). По той же причине проверка на столкновение не должна просто определяться флагом true/false.