1

关于安全性和实用性,我对我的 Firebase 设置有疑问。

目标是使用户能够购买积分,并一一消费这些积分。为了实现这一点,我设置了一个“ users ”对象来存储用户数据(姓名、地址等),一个“ transactions ”对象来存储所有购买(金额、时间等),以及一个“ spendcredits ”我存储连接到用户花费信用的数据的对象(时间,在什么等)。

由于应用程序必须知道用户仍然可以花费多少积分,我在用户对象中创建了一个名为 validCredits 的变量,当前可用的积分应该存储在其中。用户对“ users ”中他自己的用户对象具有读+写权限,对“ spendcredits ”中他自己的对象具有读+写权限。只有不同的服务器对“事务”对象具有读+写权限。

所以发生的情况是,用户购买了 5 个积分。服务器用 +5 更新他的 validCredits 变量。用户花费一个积分 (-1),花费另一个积分 (-1) 并再购买 5 个积分 (+5)。他的新 validCredits 金额为 8。

我不确定这是否是安全/最佳设置。恐怕由于用户对自己的帐户具有写入权限,其中存储了“ validCredits ”变量,因此他可能以某种方式通过增加此值来添加额外的信用?或者可以通过只允许用户在该字段上使用“-1 credit”运算符来防止这种情况发生吗?

我还可以想象,您可能希望将所有内容存储在“事务”对象中,并在 App 请求最新数量的有效 Credits 时对所有事务进行总和?对于这种带有付款和信用的系统,一般推荐什么?

4

1 回答 1

1

以下规则可用于强制用户一次只能减少validCredits一个。我假设您有某种方法可以将服务器与用户区分开来,这就是所auth.isServer代表的。

{
  "users": {
    "$uid": {
       validCredits": "auth.isServer || newData.val() === data.val() - 1"
    }
  }
}
于 2015-10-17T18:00:43.023 回答