保护新闻通讯的基本 Firebase 表单

Orb*_*boo 3 firebase firebase-security firebase-realtime-database

我想创建一个时事通讯订阅表格。这意味着用户无需创建帐户即可注册我的新闻通讯。

我想做一个简单的插入。但确保其安全的最佳方法是什么?

我已经实现了“匿名登录”(https://firebase.google.com/docs/auth/web/anonymous-auth

我需要基本规则,read检查用户是否已注册并将write用户数据推送到实时数据库中。

{
  "rules": {
     ".read": "auth != null",
     ".write": "auth != null"
  }
}
Run Code Online (Sandbox Code Playgroud)

匿名登录完成后,我将推送到实时数据库。

let dbConnection = firebase.database().ref('/newsletter_user');
dbConnection.push(datas).then(callback);
Run Code Online (Sandbox Code Playgroud)

问题是匿名身份验证不检查身份验证域。(如何在 firebase 中阻止 localhost?

这意味着用户可以获取我的 ApiKey 并向我的 realbase 数据库执行插入或读取数据。

那么它对我来说似乎并不真正安全。我可以做什么来提高安全性?

And*_*ool 5

为了提高安全性,您可以做的一件事就是限制数据库访问。目前,您的数据库有基本的读/写规则,这意味着经过身份验证的人可以在您的数据库中执行任何操作。如果我愿意,我可以在您的节点中编写整个百科全书datadump:)

因此,您可以做的第一件事就是限制对特定位置的读/写访问:

{
  "rules": {
    "newsletter_user" : {
       ".read": "auth != null",
       ".write": "auth != null"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

现在我只能在newsletter_user节点下做一些事情了。

接下来,您可以使用验证规则来确保只能写入您想要的数据:

{
  "rules": {
    "newsletter_user" : {
       ".read": "auth != null",
       ".write": "auth != null",
       // a valid newsletter_user must have attributes "color" and "size"
       // allows deleting newsletter_user (since .validate is not applied to delete rules)
       ".validate": "newData.hasChildren(['color', 'size'])",
       "size": {
         // the value of "size" must be a number between 0 and 99
         ".validate": "newData.isNumber() &&
                  newData.val() >= 0 &&
                  newData.val() <= 99"
       },
       "color": {
         // the value of "color" must exist as a key in our mythical
         // /valid_colors/ index
         ".validate": "root.child('valid_colors/' + newData.val()).exists()"
       }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)