Firebase Realtime Database セキュリティ ルールは、データベースへの読み取りおよび書き込みアクセス権を持つユーザー、データの構造、存在するインデックスを決定します。これらのルールは Firebase サーバー上に存在し、常に自動的に適用されます。すべての読み取りおよび書き込み要求は、ルールで許可されている場合にのみ完了します。デフォルトでは、ルールによりデータベースへのアクセスは許可されません。これは、ルールをカスタマイズしたり、認証を設定したりする時間ができるまで、データベースを悪用から保護するためです。
Realtime Database セキュリティ ルールには JavaScript に似た構文があり、次の 4 つのタイプがあります。
ルールの種類 | |
---|---|
。読む | ユーザーによるデータの読み取りが許可されているかどうか、およびいつ許可されているかを示します。 |
。書きます | データの書き込みが許可されているかどうか、およびいつ許可されているかについて説明します。 |
。検証 | 正しくフォーマットされた値がどのように見えるか、子属性を持つかどうか、およびデータ型を定義します。 |
.indexOn | 順序付けとクエリをサポートするためにインデックスを作成する子を指定します。 |
Realtime Database のセキュリティの概要
Firebase Realtime Database は、アプリのセキュリティを管理するためのツール一式を提供します。これらのツールを使用すると、ユーザーの認証、ユーザー権限の適用、入力の検証を簡単に行うことができます。
Firebase を利用したアプリは、他の多くのテクノロジー スタックを使用したアプリよりも多くのクライアント側コードを実行します。したがって、セキュリティへの取り組み方は、これまでとは少し異なる場合があります。
認証
アプリを保護するための一般的な最初のステップは、ユーザーを識別することです。このプロセスは認証と呼ばれます。 Firebase Authenticationを使用して、ユーザーがアプリにサインインできるようにすることができます。 Firebase Authentication には、Google や Facebook などの一般的な認証方法のドロップイン サポート、メールとパスワードによるログイン、匿名ログインなどがあります。
ユーザー ID は重要なセキュリティ概念です。ユーザーごとに異なるデータがあり、場合によっては異なる機能を持っています。たとえば、チャット アプリケーションでは、各メッセージはそれを作成したユーザーに関連付けられます。ユーザーは自分のメッセージを削除することもできますが、他のユーザーが投稿したメッセージは削除できません。
認可
ユーザーの識別は、セキュリティの一部に過ぎません。彼らが誰であるかがわかったら、データベース内のデータへのアクセスを制御する方法が必要です。 Realtime Database セキュリティ ルールを使用すると、各ユーザーのアクセスを制御できます。たとえば、パス/foo/
の読み取りは誰でも許可するが、書き込みは許可しない一連のセキュリティ ルールを次に示します。
{ "rules": { "foo": { ".read": true, ".write": false } } }
.read
および.write
ルールはカスケードするため、このルールセットは、パス/foo/
にあるすべてのデータと、 /foo/bar/baz
などのより深いパスにあるデータへの読み取りアクセスを許可します。データベース内のより浅い.read
および.write
ルールがより深いルールをオーバーライドすることに注意してください。したがって、パス/foo/bar/baz
のルールが false と評価された場合でも、この例では/foo/bar/baz
への読み取りアクセスが許可されます。
Realtime Database セキュリティ ルールには組み込みの変数と関数が含まれており、他のパス、サーバー側のタイムスタンプ、認証情報などを参照できます。認証済みユーザーに/users/<uid>/
への書き込みアクセスを許可するルールの例を次に示します。 <uid> は Firebase Authentication で取得したユーザーの ID です。
{ "rules": { "users": { "$uid": { ".write": "$uid === auth.uid" } } } }
データ検証
Firebase Realtime Database はスキーマレスです。これにより、開発中に簡単に変更できますが、アプリを配布する準備が整ったら、データの一貫性を保つことが重要です。ルール言語には.validate
ルールが含まれており、 .read
および.write
ルールに使用されるのと同じ式を使用して検証ロジックを適用できます。唯一の違いは、検証ルールがカスケードされないことです。そのため、書き込みを許可するには、関連するすべての検証ルールが true と評価される必要があります。
これらのルールは、 /foo/
に書き込まれるデータが 100 文字未満の文字列でなければならないことを強制します。
{ "rules": { "foo": { ".validate": "newData.isString() && newData.val().length < 100" } } }
検証規則は、 .read
および.write
規則と同じすべての組み込み関数および変数にアクセスできます。これらを使用して、データベース内の他の場所のデータ、ユーザーの ID、サーバー時間などを認識する検証ルールを作成できます。
データベース インデックスの定義
Firebase Realtime Database では、データの順序付けとクエリが可能です。データ サイズが小さい場合、データベースはアドホック クエリをサポートするため、通常、開発中にインデックスは必要ありません。ただし、アプリを起動する前に、必要なクエリのインデックスを指定して、アプリの成長に合わせて確実に機能し続けることが重要です。
インデックスは、 .indexOn
ルールを使用して指定されます。以下は、恐竜のリストの高さと長さのフィールドにインデックスを付けるインデックス宣言の例です。
{ "rules": { "dinosaurs": { ".indexOn": ["height", "length"] } } }