Firebase 3.0安全规则 - 不允许推送匿名儿童

时间:2016-05-30 20:23:18

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

我正在构建一个允许用户标记其工作时间的应用程序。在我的应用程序是2种类型的用户。其中一个是“员工”,它只具有读访问权限,另一个是具有读写权限的“管理员”。允许员工阅读自己的工作时间,并允许管理员为每个用户/员工创建新用户或添加工作时间。

管理员填写表单并推送数据。在firebase上,我检查了用户是否经过身份验证,并为用户对象的每个属性运行了验证。但是我问自己,如果有人复制我的firebase url(在源代码中可见)并尝试将一些匿名对象或属性推送到我的数据库,该怎么办?

例如,我的SignUp表单需要以下字段:

{ 
   "users": {
      "-KInd4V0V9k5n6yhAETd": {
         "uid": "-KInd4V0V9k5n6yhAETd",
         "username": "Haris",
         "password": "HelloWolrd123",
         "age":      "21"
         }
    }
}

在firebas方面,我已经使用newData方法检查子项是否从表单传递:

".validate": "newData.hasChildren(['uid','username','password,'age'])"

我已经运行了每个属性的验证,检查数据是否有效,如username.isString()等。

那么,如果管理员将这样的开发者工具用户对象推送到我的数据库(已添加电子邮件属性)

,该怎么办?
 {
    "-KInd4V0VEEEEEEEE": {
         "uid": "-KInd4V0VEEEEEEEE",
         "username": "Haris",
         "password": "HelloWolrd123",
         "age":      "21",

         // anonymous Object pushed from n admin developer-console
          "email": "anonymous@object.com"
         }
}

这将起作用,因为所有必填字段都有效并且验证在firebase上传递。但是,如何拒绝管理员无法添加并将“电子邮件”属性传递到我的firebase数据库?因为我的数据库上的用户对象结构没有电子邮件属性。我不想让用户可以将他自己的匿名对象/数据推送到我的数据库。我是否需要验证每个属性,或者是否有可以验证Object本身的方法?像newData('users')。isValid()?如果属性是append,则isValid返回false,因为该对象与数据库结构中的对象不同?

1 个答案:

答案 0 :(得分:2)

我不完全确定,但认为您正在寻找拒绝所有其他孩子的规则。如果这确实是您正在寻找的,那么:

{
  "rules": {
    "users": {
      "$uid": {
        // Valid users have these properties
        ".validate": "newData.hasChildren(['uid','username','password,'age'])",
        // The uid property must be a string and refer to an existing noder under /users
        "uid": {
          ".validate": "newData.isString() && root.child('users').child(newData.val()).exists()"
        },
        // the user name must be a string
        "username: {
          ".validate": "newData.isString()"
        },
        "password: {
          // I really hope you're not storing a password
        },
        "age: {
          // TODO: you're storing age as a string now, might want to fix that
          ".validate": "newData.isNumber()"
        },
        // All other properties are rejected
        "$other": {
          ".validate": false
        }
      }
    }
  }
}