如何防止在同一父节点中检索子节点?

时间:2016-05-12 15:38:29

标签: firebase firebase-security

我想阅读用户父节点的所有用户名,因为我在我的应用中使用搜索功能(如果在用户节点中提供了searchActive:true child)。但电子邮件只能由所有者访问。

我刚刚尝试过,但我仍然收到电子邮件。我担心安全不仅仅是电子邮件,我缺少什么,我如何组织所有这些?

"rules": {
    "users": {
      ".read": "auth !== null",
      "$uid": {
         ".write": "auth !== null && auth.uid === $uid",
         ".read": "auth !== null && auth.uid === $uid",
          "username": {
             ".validate": "
              !root.child('usernames').child(newData.val()).exists() ||
               root.child('usernames').child(newData.val()).val() == $uid"
               },
          "email": {
              ".read": "auth.uid == 'facebook:'+$uid || auth.uid == $uid"
               }
         }
    },
    "usernames": {
          ".write": "auth !== null",
          ".read": "auth !== null"
    },

1 个答案:

答案 0 :(得分:1)

首先,你仍然可以访问电子邮件的原因是因为rules cascade意味着当您为父节点设置read为true时,也可以读取所有子节点。在你的情况下:

"users": {
  //Read is being set to true here for everything in this node
  ".read": "auth !== null",
  "$uid": {
     ".write": "auth !== null && auth.uid === $uid",
     //This will be ignored, since read was allowed already
     ".read": "auth !== null && auth.uid === $uid",
      "username": {
         ".validate": "
          !root.child('usernames').child(newData.val()).exists() ||
           root.child('usernames').child(newData.val()).val() == $uid"
           },
      "email": {
          //This will be ignored, since read was allowed already
          ".read": "auth.uid == 'facebook:'+$uid || auth.uid == $uid"
           }
     }
},
"usernames": {
      ".write": "auth !== null",
      ".read": "auth !== null"
},

我建议您花一些时间阅读有关firebase安全性的所有文档。它可以真正帮助您避免这种情况,也许会让您对为您的案例实施良好的安全性提出一些想法。

可能的解决方案是使用单独的用户名节点,您可以在其中存储搜索功能的所有用户名。您可以使用规则来确保每个人都可以阅读它,但只有特定用户名的所有者才能更改它。