Firebase Summit で発表されたすべての情報をご覧ください。Firebase を使用してアプリ開発を加速し、自信を持ってアプリを実行する方法を紹介しています。詳細

FirebaseRealtimeデータベースのセキュリティルールを理解する

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

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"]
    }
  }
}

次のステップ

  • データベースのルール開発の計画を開始します。
  • セキュリティ ルールを使用してデータを保護する方法については、こちらをご覧ください。
  • ルールを使用してインデックスを指定する方法の詳細をご覧ください。