瞭解 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」的讀取權限 即使 /foo/bar/baz 路徑中的規則評估為 false 也一樣。

即時資料庫安全性規則包括 內建變數 以及功能 參照其他路徑、伺服器端時間戳記、驗證資訊 等等。以下舉例說明的規則將寫入權限授予 向「/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"]
    }
  }
}

後續步驟