瞭解 Firebase 即時資料庫安全性規則

Firebase 即時資料庫安全性規則可決定資料庫的讀取和寫入權限、資料結構,以及存在的索引。這些規則會儲存在 Firebase 伺服器上,並一律自動強制執行。只有在規則允許的情況下,系統才會完成每項讀取和寫入要求。根據預設,您的規則不會允許任何人存取資料庫。這麼做是為了保護資料庫免於遭到濫用,直到您有時間自訂規則或設定驗證機制為止。

即時資料庫安全性規則採用類似 JavaScript 的語法,共有四種類型:

規則類型
.read 說明是否允許使用者讀取資料,以及允許讀取的時間。
.write 說明是否允許寫入資料,以及何時允許寫入資料。
.validate 定義正確格式的值應如何顯示、是否有子項屬性,以及資料類型。
.indexOn 指定要索引的子項,以便排序和查詢。

Realtime Database 安全性總覽

Firebase Realtime Database 提供一整套工具,可用於管理應用程式的安全性。這些工具可讓您輕鬆驗證使用者、強制執行使用者權限,以及驗證輸入內容。

相較於採用其他多種技術堆疊的應用程式,Firebase 應用程式會執行更多用戶端程式碼。因此,我們處理安全性的做法可能與您習慣的方式有些不同。

驗證

保護應用程式安全的第一步通常是識別使用者。這項程序稱為「驗證」。您可以使用 Firebase 驗證,讓使用者登入應用程式。Firebase 驗證提供 Google 和 Facebook 等常見驗證方法的即時支援,以及電子郵件和密碼登入、匿名登入等功能。

使用者身分是重要的安全概念。不同使用者的資料不同,有時功能也會有所差異。舉例來說,在即時通訊應用程式中,每則訊息都會與建立該訊息的使用者建立關聯。使用者也可以刪除自己的訊息,但無法刪除其他使用者張貼的訊息。

授權

辨識使用者只是安全性措施的一部分。知道這些使用者身分後,您需要設法控管他們對資料庫資料的存取權。您可以透過即時資料庫安全性規則控管個別使用者的存取權。舉例來說,以下是一組安全性規則,可讓任何人讀取路徑 /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 規則的所有內建函式和變數。您可以使用這些資料建立驗證規則,讓系統瞭解資料庫中其他位置的資料、使用者身分、伺服器時間等等。

定義資料庫索引

Firebase Realtime Database 可讓您排序及查詢資料。如果資料量較小,資料庫會支援臨時查詢,因此開發期間通常不需要索引。不過,在推出應用程式之前,請務必為所有查詢指定索引,確保這些查詢在應用程式擴充時仍能正常運作。

您可以使用 .indexOn 規則指定索引。以下是索引宣告範例,會為恐龍清單的高度和長度欄位建立索引:

{
  "rules": {
    "dinosaurs": {
      ".indexOn": ["height", "length"]
    }
  }
}

後續步驟

  • 開始規劃資料庫的規則開發作業。
  • 進一步瞭解如何使用安全性規則保護資料
  • 進一步瞭解如何使用規則指定索引