为简报获取安全的基本Firebase表单

时间:2018-07-09 16:47:14

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

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

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

我已经实现了“匿名登录”(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数据库中。

那对我来说似乎并不安全。我该怎么做才能提高安全性?

1 个答案:

答案 0 :(得分:2)

可以提高安全性的一件事是限制数据库访问。当前,您对数据库具有基本的读/写规则,这意味着经过身份验证的人员可以在数据库中执行任何操作。如果我愿意,我可以在您的{ "rules": { "newsletter_user" : { ".read": "auth != null", ".write": "auth != null" } } } 节点中写完整的百科全书:)

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

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()" } } } } 节点下做某事。

接下来,您可以使用validation rules确保仅写入所需的数据:

CASE temperature WHEN ...