Help us understand the problem. What is going on with this article?

Firebaseのセキュリティ設定をしよう

More than 3 years have passed since last update.

Firebaseのセキュリティ設定はこのようにすることで誰でも書き込み可能になります。

{
  "rules": {
    ".read": true,
    ".write": true
  }
}

これはデータベース中の全てのデータが認証なしに無条件に読み書き削除が可能という最もゆるい状態です。アプリケーションのプロトタイプを作っていく間はこの方が余計なトラブルがなくて良いかもしれませんが、一般公開するシステムでこのような設定になっていると外部からいたずらでデータを改ざんされたり削除されたりする可能性があるので、きちんとセキュリティ設定をしなければいけません。

秘密鍵で認証する

一番簡単なセキュリティ設定は、全ての読み書きを秘密鍵で認証されたクライアントのみで行うようにすることです。
まず、セキュリティ設定を全て読み書き不可にします。

{
  "rules": {
    ".read": false,
    ".write": false
  }
}

こうすることで、RESTやFirebase SDKを使用したデータベースの読み書きは一切できなくなります。が、管理コンソールからデータをいじる場合と秘密鍵を使って認証した場合は上記のセキュリティ設定に関わらず全てのデータを読み書きできます。
一番堅牢かつシンプルなセキュリティ設定ですが、秘密鍵が絶対に漏れないように注意しましょう。

特定の変更操作のみを許可する

".validate"の記述を使うことで、どのようなデータ変更を許可するかを細く設定することが可能です。例えば以下のようなデータ構造の時にcontent.id123.usedCountにはカウントアップの変更のみを許可したいとします。

{
  "content": {
    "id123": {
      "usedCount": 0,
      "firstUser": "Taro"
    }
  }
}

これはセキュリティ設定をこうすれば実現できます。

{
  "rules": {
    ".read": false,
    ".write": false,

    "content": {
      "$id": {
        "usedCount": {
          ".write": true, // 誰でも変更可能
          ".validate": "newData.val() == data.val() + 1" // 前のデータより1大きい値のみ設定可能
        }
      }
    }
  }
}

その他、例えばcontent.id123.firstUserにデータがなかった時に新規作成はできるが、更新は不可とするというルールにしたければ次のようになります。

{
  "rules": {
    ".read": false,
    ".write": false,

    "content": {
      "$id": {
        "firstUser": {
          ".write": true, // 誰でも変更可能
          ".validate": "!data.exists()" // 以前のデータが存在しない場合のみ許可
        }
      }
    }
  }
}

このようにきちっと書き込みルールを設定しておけば、普通ならサーバー側に隠蔽して行うデータベースアクセス処理でも直接クライアントから行わせられるようになります。

Firebase便利ですね。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away