如何为 Firebase DB 设置安全规则,以便任何用户都不能向 DB 发出未经授权的请求?

How can I set security rules for Firebase DB so that no user can make unauthorized requests to DB?

我正在尝试通过结帐(使用 paypal)开发一种付款方式以获得 discord 机器人的付费计划。然后,当用户付款时,child“prem”设置为 true,如下所示:

 paypal.Buttons({
        style: {
            color: 'blue',
            shape: 'pill'
        },
        createOrder:function (data, actions){
            return actions.order.create({
                purchase_units: [{
                    amount:{
                        value: '1.00'
                    }
                }]
            });
        },
         onApprove:function (data, actions){
                return actions.order.capture().then(function (details){
                    console.log(details)
                    

                    database.ref('server/' + guildId + '/prem').set(true); //here
                })
            }
    }).render('#paypal-payment-button');

问题是我的实时数据库没有安全规则(它接受所有请求):

{
  "rules": {
    ".read": true,  
    ".write": true,  
  }
}

这是我的数据库结构:

{
   "server": {
     "858941532694118431": {
       "prem": true, //premium plan activated
       "settings": {
         "error": "on",
         "warnings": "on"
       }
     }
   }
}

由于我的规则允许所有人访问,因此每个用户都可以在控制台中编写此代码以激活高级版而无需付费:

database.ref('server/' + serverId + '/prem').set(true);

我如何设置我的安全规则,以便没有用户可以修改 child 但只有自动系统可以?有办法吗?

您首先不应允许用户更新 prem。即使您允许用户更新自己的会员资格,他们仍然可以在不使用 Paypal 付款的情况下将其转为 true

相反,请尝试使用 Paypal Webhooks,它可以在收到付款时触发 HTTP 云功能,并在验证付款后从云功能更改用户的高级状态。

然而,即使您想直接写入数据库,服务器 ID 似乎也不是默认的 Firebase Auth UID。如果那不是用户的 UID,那么将很难为其实施规则。

{
  "rules": {
    "server": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

这些规则将允许具有 UID 1234 的用户仅编辑 /server/1234/ 路径。


既然ID是Discord公会的ID,那么最好使用webhook。您可以使用 Firebase Cloud Function 并将其 URL 设置为 Paypal 中的网络钩子传送 URL。 Webhook 应包含有关交易的其他信息,如果需要,您甚至可以包含一些元数据,如公会 ID。验证付款并根据需要更新您的数据库。

确保规则设置为 ".write": false,这样任何用户都不能直接更新该状态。