【问题标题】:Secure basic Firebase form for newsletter安全简报的基本 Firebase 表单
【发布时间】:2018-07-09 16:47:13
【问题描述】:

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

我想做一个简单的插入。但是保护它的最佳方法是什么?

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

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

{
  "rules": {
     ".read": "auth != null",
     ".write": "auth != null"
  }
}

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

let dbConnection = firebase.database().ref('/newsletter_user');
dbConnection.push(datas).then(callback);

问题是匿名身份验证不检查身份验证域。 (How to block localhost in firebase?)

意味着用户可以获取我的 ApiKey 并将数据插入或读取到我的 realbase 数据库中。

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

【问题讨论】:

  • 它有什么不安全的地方?例如。哪些代码现在可以成功运行,而您想要失败?一旦您知道这一点,您就可以调整您的安全规则以符合该要求。
  • 感谢@FrankvanPuffelen 规则运行良好,这意味着用户必须先进行匿名身份验证才能将数据推送到实时数据库。但是匿名身份验证总是成功...我已从“授权域”中删除“本地主机”以进行“身份验证”以执行测试,但我仍然可以从本地主机进行匿名身份验证...任何线索?
  • 那么,当您从授权域中删除 localhost 时,您是否问为什么可以从 localhost 匿名登录?这是一个有效的问题,但与您原来的帖子完全不同。
  • 你说得对,我已经更新了帖子,也是因为我已经对 AuthDomain 进行了解释,但仍在试图找到一种方法来保护我的表单。也许验证码?也不确定。

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


【解决方案1】:

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

所以你可以做的第一件事就是限制对特定位置的读/写访问:

{
  "rules": {
    "newsletter_user" : {
       ".read": "auth != null",
       ".write": "auth != null"
    }
  }
}

现在只能在newsletter_user节点下做点什么了。

接下来您可以使用validation rules 确保只写入您想要的数据:

{
  "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()"
       }
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 2016-04-01
    • 1970-01-01
    • 2014-02-25
    相关资源
    最近更新 更多