2016-08-22 4 views
4

おそらく、私はSQLのような観点からこの問題に取り組んでいるかもしれませんが、どの子ノードにノードを設定するのを適切に制限するかを理解するのに困っています。"Firebugデータベースのルールをすべてキャッチ"

私は任意の名前の製品の記録を残したいとします。各商品にはpriceが含まれている必要がありますが、それ以外は許可されません。

私の素朴なアプローチはややswitch文のdefault句のように(明示的に$otherノードをpriceノードへの書き込みアクセスを許可し、すべてのアクセスを削除し、price子を含むようにあるnewDataを必要とする製品に.validateルールを追加しました):

{ 
    "rules": { 
     "$product": { 
      ".read": true, 
      ".write": true, 
      ".validate": "newData.hasChildren(['price'])", 
      "price": { 
       ".write": true, 
       ".validate": "newData.isNumber()" 
      }, 
      "$other": { 
       ".read.": false, 
       ".write": false, 
      } 
     } 
    } 
} 

これは機能しません。 {"price": 1234, "foo": "bar"}の新製品を追加することは引き続き受け付けます。 しかし、$other".validate": falseルールを追加した場合は、何も代わりません({"price": 1234}は許可されません)。(何とか間違っていました)

私はここで何をしようとしているのと同様の方法を実装する方法はありますか?そうでない場合、Firebaseのデータ構造を制限する適切な方法は何ですか?私はまったくそれをするべきですか?私は、データベースをゴミ箱に詰め込まないようにするにはどうしたらいいですか?

+0

私は従わわからない、なぜ '「$その他」:{「.validate」:偽}'あなたが望むものではありません。ただし、それを無視して、一度許可されたパーミッションを取り消すことはできません。 '$ product'の' .write ":trueは' $ other'の '.write":false'を無視していますか? – cartant

+0

@cartantなぜ検証が機能しないのかを明確にするために質問を更新しました。 –

答えて

7

ここでは、いくつかの一般的なFirebaseセキュリティピットに落ちています。最も一般的なのは、アクセス権がカスケードされるということです。ツリー内の特定のレベルの読み取りまたは書き込みのアクセス権を許可すると、そのアクセス権を低いレベルで取り除くことはできません。

"$other": { 
    ".read.": false, 
    ".write": false, 
} 

あなたは.validateルールが異なっていることを認識しなければならない問題を解決するには:データがある(あなたが高いすでに付与読み取り/書き込み1つのレベルをしたので)これらのルールは無力であることを意味

すべて検証ルールが満たされている場合にのみ有効とみなされます。ですから、検証ルールで$otherデータを拒否することができます。

{ 
    "rules": { 
     "$product": { 
      ".read": true, 
      ".write": true, 
      ".validate": "newData.hasChildren(['price'])", 
      "price": { 
       ".validate": "newData.isNumber()" 
      }, 
      "$other": { 
       ".validate": false 
      } 
     } 
    } 
} 
+0

これで解決します。面白いのは、私がこの質問を簡単に言及したように、この非常に解決策を試してみたと思っていたことです。いずれにしても、あなたの答えは、検証と書き込みの違いを私にははるかに明確にしました。 :) –

+0

これはどのようにボルトで見えるでしょうか? – Waltari

関連する問題