在网络游戏中创建反作弊



我有一个简单的网站,里面有一个小游戏。它有一个使用express的基本记分板-每次你死了,网站都会向服务器发送一个包含你的分数的帖子请求,服务器会将其添加到排行榜中。我的问题是排行榜很容易被利用。通过开发工具,人们可以很容易地:

  • 禁用对撞机,这样他们就不会死,然后当他们对分数满意时再打开它
  • 直接把分数设定为他们想要的值
  • 使用控制台发送自己的帖子请求,并附上自己选择的分数

我曾想过创建一个服务器端的分数计数器和冲突检查器,但我的游戏节奏很快,所以我认为这会有问题,而不是谈论如果多人同时玩,它会给服务器带来的计算能力。

这真的是唯一的解决方案吗?还是有我没有想到的更简单的解决方案?

服务器代码:

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)=>{
var rawData = fs.readFileSync('./database.json');
var data = JSON.parse(rawData);
res.json(data);
})
app.post('/leaderBoard', (req, res)=>{
var rawData = fs.readFileSync('./database.json');
var leaderBoard = JSON.parse(rawData).leaderBoard;
for(var i = 0; i < leaderBoard.length; i++){
if(req.body.score > leaderBoard[i].score){
for(let i2 = leaderBoard.length -1; i2 > 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秒内获得超过100分,那么他就是在作弊(。

使用缩小的代码不会有什么坏处,你也可以用抽象的变量名称(a、b、c,而不是"score"(来代替你的变量名称。出于同样的原因,冲突检查不应该仅仅由真/假标志来定义。

最新更新