如何保护HTTPs触发函数,从黑客手中增加用户的余额



我在安卓上有一个简单的游戏,它调用HTTPS firebase云函数来增加玩家在完成游戏回合后的平衡,问题是我有一些黑客经常调用这个函数来增加他们的奖励,我如何保护这个函数不被滥用? 我可以在客户端实现任何逻辑?

// this is a simple function that increases the player's balance after the game.
const MAX_REWARD = 1000;            
exports.GameFinish = functions.https.onRequest((req, res) => {
if (!req.headers.authorization) {
console.error('No Firebase ID token was passed');
res.status(403).send('Unauthorized');
return;
}

res.contentType("application/json");

if (req.query.userID) {
userid = req.query.userID;
}
else {
return res.status(404).json({'msg': 'Error', balance: 0, errors: 'no user ID was supplied'});    
}

if (!req.query.award) {
return res.status(404).json({'msg': 'Error', balance: 0, errors: 'no award was supplied'});  
}

var award_amount = parseInt(req.query.award);
if( award_amount > MAX_REWARD)
{
console.log('rewards exceeding the max limit!', result);
award_amount = MAX_REWARD;          
}

admin.auth().verifyIdToken(req.headers.authorization).then(decodedIdToken => {
return checkUserExists(userid).then((userinfo) => {
if(userinfo != null)
{

var ref_prize = admin.database().ref("/game/${userid}/total_prize");
ref_prize.transaction(function(totalPrize) {
return totalPrize + award_amount;
});
}
else 
// error user is not in the record
res.status(200).json({'msg': 'Error', balance: 0, errors:  'no such a user exists'}); 
});
}).catch(error => {
console.error('Error while verifying Firebase ID token:', error);
res.status(403).send('Unauthorized'); });   
});

这种类型的滥用在游戏中相当普遍。您需要通过实现以下任何或所有方法来防止它:

  1. 传入已完成游戏的 ID,并验证每个已完成的游戏是否只能为每个玩家计数一次。这是迄今为止最有效的改进,因为它使得不玩游戏就不可能增加分数。
  2. 在响应中仅返回基本错误消息,并依靠日志记录来解决实际问题。这意味着攻击者将更难通过检查错误来确定代码的工作方式。
  3. 传递有关已完成游戏的游戏玩法的信息,验证这是一组有效的移动,并确定服务器上的奖励。因此,玩家说"我赢了这么多分",让他们说"我做了这些动作"。然后,您的函数确定这些移动后的游戏状态,并确定获胜者和奖励。请注意,您可能已经在游戏过程中记录数据库中的移动,在这种情况下,您只需要玩家传入游戏 ID。
  4. 一般来说,记录动作是能够分析它们以检测错误游戏的好方法。即使您今天不进行此分析,通过这些移动也可以稍后(如果需要)执行此操作。

所有这些都必须在服务器中实现,例如在Cloud Functions或Firebase的服务器端安全规则中。根据定义,不能信任客户端运行您的代码。

这些做法可能还有很多,但这些是这里首先想到的。

顺便说一句:恭喜你让一款游戏足够成功,以至于玩家试图破解它! :-)

最新更新