首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FireBase3.0安全规则-不允许推送匿名儿童

FireBase3.0安全规则-不允许推送匿名儿童
EN

Stack Overflow用户
提问于 2016-05-30 20:23:18
回答 1查看 404关注 0票数 0

我正在构建一个应用程序,允许用户标记他们的工作时间。在我的应用程序中有两种类型的用户。其中一个是只具有读访问权的'employee‘,另一个是具有读写访问权限的'admin’。允许员工读取他们自己的工作时间,并且允许管理员为每个用户/雇员创建新用户或添加工作时间。

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

例如,我有一个SignUp表单,它需要以下字段:

代码语言:javascript
复制
{ 
   "users": {
      "-KInd4V0V9k5n6yhAETd": {
         "uid": "-KInd4V0V9k5n6yhAETd",
         "username": "Haris",
         "password": "HelloWolrd123",
         "age":      "21"
         }
    }
}

在火边,我已经使用newData方法检查了子表是否从表单中传递出来:

代码语言:javascript
复制
".validate": "newData.hasChildren(['uid','username','password,'age'])"

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

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

代码语言:javascript
复制
 {
    "-KInd4V0VEEEEEEEE": {
         "uid": "-KInd4V0VEEEEEEEE",
         "username": "Haris",
         "password": "HelloWolrd123",
         "age":      "21",

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

这将有效,因为所有必需的字段都是有效的,并且验证是在firebase上通过的。但是,我如何拒绝管理员不能添加'email‘属性并将其传递给我的防火墙数据库?因为数据库上的用户对象结构没有电子邮件属性。我不想让用户将自己的匿名对象/数据推送到我的数据库中。我是否需要验证每个属性,还是有一个方法可以验证对象本身?比如newData(‘用户’).isValid()?如果附加了一个属性,那么isValid返回false,因为对象在数据库结构中不一样?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-30 21:01:26

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

代码语言:javascript
复制
{
  "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
        }
      }
    }
  }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37533188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档