【发布时间】:2018-09-27 08:22:01
【问题描述】:
我在android上有一个简单的游戏,在完成游戏回合后调用了一个HTTPS firebase cloud函数来增加玩家的余额,问题我有一些黑客经常调用这个函数来增加他们的奖励,我该如何保护这个功能被滥用了吗?我可以在客户端实现的任何逻辑吗?
// 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'); });
});
【问题讨论】:
-
不应该在内部更新余额作为在同一交易中完成游戏回合的一部分吗?我的意思是为什么要将余额更新 API 暴露给外部世界。如果必须公开,是否应该有一些同步或异步机制来验证用户的操作是否值得更新余额。例如可能余额更新 API 需要提供游戏实例 id,如果 api 逻辑发现游戏实例 id 已经有更新,或者游戏实例 id 甚至没有玩过,则游戏实例 id 会在那里过期不会有任何更新
标签: javascript firebase firebase-realtime-database firebase-authentication google-cloud-functions