【问题标题】:A better way of enforcing a list执行列表的更好方法
【发布时间】:2013-08-12 13:24:43
【问题描述】:

请考虑以下规则:

"list" : {
    "$item" : {
        ".validate": "newData.hasChildren(['field1', 'field2'])",
            "field1" : {
                ".validate": newData.isString()
            },
            "field2" : {
                ".validate": newData.isString()
            },
            "$other" : {
                ".validate": false
            }
        }
    }
}

它应该只允许您构建特定类型的对象列表。但是,没有什么可以阻止以下情况:

{
    "list" : "i've been hacked"
}

我唯一能想到的就是将其添加到“列表”规则中:

".validate": "!newData.isString() && !newData.isNumber() && !newData.isBoolean()"

.. 这有点笨拙。有没有更好的方法来执行此操作,还是我的整个方法都走错了方向?

【问题讨论】:

    标签: firebase firebase-security


    【解决方案1】:

    您可以将 .write: false 添加到列表本身,并仅在 $item 上启用它。这样一来,您就无法在不验证 $item 规则的情况下写入列表。

    【讨论】:

      【解决方案2】:

      详细说明@cwehrung 的回答:

      "list": {
        ".write": false,
        "$item": {
          ".validate": "newData.hasChildren(['field1', 'field2'])",
          "field1": {
            ".write": "newData.isString()"
          },
          "field2": {
            ".write": "newData.isString()"
          }
        }
      }
      

      【讨论】:

      • 感谢您的回复。此方法适用于顶级列表,我将使用它 - 但是对于子列表,“.write”将在树的更高点设置为 true。
      【解决方案3】:

      另一种选择:

      "list": {
          ".validate": "newData.hasChildren()",
          ...
      }
      

      【讨论】:

        猜你喜欢
        • 2015-03-03
        • 2012-07-20
        • 1970-01-01
        • 1970-01-01
        • 2015-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-24
        相关资源
        最近更新 更多