【问题标题】:How can I set security rules for Firebase DB so that no user can make unauthorized requests to DB?如何为 Firebase DB 设置安全规则,以使用户无法向 DB 发出未经授权的请求?
【发布时间】:2021-11-01 14:36:24
【问题描述】:

我正在尝试通过结帐(使用贝宝)开发一种付款方式,以获取不和谐机器人的付费计划。然后,当用户付款时,子“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);

我怎样才能设置我的安全规则,以便没有用户可以修改该孩子,而只有自动系统可以?有办法吗?

【问题讨论】:

    标签: javascript firebase firebase-realtime-database paypal firebase-security


    【解决方案1】:

    您首先不应允许用户更新prem。即使您允许用户更新自己的会员资格,他们仍然可以将其转至true,而无需支付贝宝。

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

    但是,即使您想直接写入数据库,服务器 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 中的 webhook 交付 URL。 webhook 应该包含有关交易的其他信息,如果需要,您甚至可以包含一些元数据,如公会 ID。验证付款并根据需要更新您的数据库。

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

    【讨论】:

    • 父id是你打算升级到付费计划的discord服务器的公会id。此时,我应该使用 paypal webhooks 吗?
    • @conta 最好这样做。支付成功后,您可以处理 webhook,验证用户 ID 和其他详细信息,并使用相同的功能更新数据库中的信息。
    • 好的,我试试用webhooks
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-30
    • 2017-07-15
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    相关资源
    最近更新 更多