避免使用不安全的規則

本指南說明「Firebase Security Rules」的常見安全漏洞 自行設定規則,檢查並加強保護自己的規則。 並在部署變更前進行測試

如果系統通知您資料可能不安全, 查看這些常見錯誤,並更新任何有安全漏洞的規則。

使用 Firebase Security Rules

如要查看現有Rules,請使用 Firebase CLI 或 Firebase 控制台。請務必使用相同的方式編輯規則 以避免意外覆寫更新。如果您不確定在本機定義的規則是否反映最新更新,Firebase 控制台一律會顯示最近部署的 Firebase Security Rules 版本。

如要透過 Firebase 控制台存取規則,請選取 ,然後前往 Realtime DatabaseCloud Firestore儲存空間:連結至正確的資料庫或儲存空間後,按一下「規則」 Cloud Storage 也提供目錄同步處理功能 方便您同步處理 VM 目錄與值區

如要透過 Firebase CLI 存取規則,請前往 在 firebase.json 檔案中記下的規則。

瞭解 Firebase Security Rules

Firebase Security Rules 可防範惡意使用者侵害你的資料。建立資料庫時 Firebase 控制台中的執行個體或 Cloud Storage 值區,您可以 您可以選擇拒絕所有使用者的存取權 (鎖定模式),或是授予 所有使用者 (測試模式)。雖然您可能會在開發期間採用較開放的設定,但請務必在部署應用程式前,花時間妥善設定規則並保護資料。

在開發應用程式並測試規則的不同設定時,請使用其中一個本機 Firebase 模擬器,在本機開發環境中執行應用程式。

規則不安全的常見情況

您可能已預設或一開始就設定的 Rules 在開發應用程式時致力接受審查及更新 再部署應用程式確認您已妥善保護使用者資料 有助於避免下列常見錯誤

開放存取

設定 Firebase 專案時,您可能已設定規則,允許在開發期間開放存取權。您可能會以為自己是唯一使用 但如果您已部署應用程式,則可在網際網路上取得。如果不是 驗證使用者並設定安全性規則,一切有把握 專案 ID 可竊取、修改或刪除資料。

不建議:以下項目的讀取及寫入權限: 所有使用者。

Cloud Firestore

// Allow read/write access to all users under any conditions
// Warning: **NEVER** use this ruleset in production; it allows
// anyone to overwrite your entire database.

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}

Realtime Database

{
  // Allow read/write access to all users under any conditions
  // Warning: **NEVER** use this ruleset in production; it allows
  // anyone to overwrite your entire database.

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

Cloud Storage

// Anyone can read or write to the bucket, even non-users of your app.
// Because it is shared with App Engine, this will also make
// files uploaded via App Engine public.
// Warning: This rule makes every file in your Cloud Storage bucket accessible to any user.
// Apply caution before using it in production, since it means anyone
// can overwrite all your files.

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write;
    }
  }
}
    
解決方案:限制讀取和 寫入權限。

建立適合資料階層的規則。常見的解決方案之一 就是透過 Firebase Authentication 以使用者為基礎的安全機制。瞭解詳情 瞭解如何使用規則驗證使用者

Cloud Firestore

Realtime Database

Cloud Storage

所有已驗證使用者的存取權

有時候,Rules 會檢查使用者已經登入,但不會進一步 根據該驗證來限制存取權如果其中一個規則包含 auth != null,請確認您要讓所有已登入的使用者都能存取資料。

不建議使用:任何登入的使用者都能讀取及寫入整個資料庫。

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    match /some_collection/{document} {
      allow read, write: if request.auth.uid != null;
    }
  }
}

Realtime Database

{
  "rules": {
    ".read": "auth.uid !== null",
    ".write": "auth.uid !== null"
  }
}

Cloud Storage

// Only authenticated users can read or write to the bucket
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null;
    }
  }
}
解決方法:透過安全性限制存取權 條件。

檢查驗證時 ,進一步限制特定使用者的存取權 為特定資料集選取標籤進一步瞭解 驗證屬性

Cloud Firestore

Realtime Database

Cloud Storage

(Realtime Database) 不當繼承的規則

Realtime Database Security Rules 階層,其中較淺層的父項路徑會覆寫較深層的子項節點規則。在子節點寫入規則時 授予對方其他權限您無法在資料庫中更精確地指定資料的存取權,也無法撤銷資料的存取權。

不建議:在子路徑中精修規則
{
  "rules": {
     "foo": {
        // allows read to /foo/*
        ".read": "data.child('baz').val() === true",
        "bar": {
          /* ignored, since read was allowed already */
          ".read": false
        }
     }
  }
}
解決方案:在父項路徑寫入規則 且會在子項路徑中授予特定權限 如果您的資料存取權需要更精細的層級,請精細設定規則。 進一步瞭解如何在 Realtime Database Security Rules 的核心語法中設定 Realtime Database Security Rules 分層結構。

禁止存取

開發應用程式時,另一種常見的做法是 資料就會遭到鎖定通常這表示您已經關閉讀取和寫入功能 並開放所有使用者使用,方法如下:

Cloud Firestore

// Deny read/write access to all users under any conditions
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

Realtime Database

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

Cloud Storage

// Access to files through Cloud Storage is completely disallowed.
// Files may still be accessible through App Engine or Google Cloud Storage APIs.

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if false;
    }
  }
}

Firebase Admin SDK 和 Cloud Functions 仍可存取資料庫。打算使用 Cloud FirestoreRealtime Database 是僅限伺服器 並與 Firebase 搭配使用 Admin SDK。雖然安全無虞,但您應測試應用程式的用戶端 以便正確擷取資料

如要進一步瞭解 Cloud Firestore Security Rules 及其運作方式,請參閱「Cloud Firestore Security Rules 入門」。

測試 Cloud Firestore Security Rules

如要檢查應用程式行為並驗證 Cloud Firestore Security Rules 設定,請使用 Firebase Emulator。在部署任何變更之前,請使用 Cloud Firestore 模擬器在本機環境中執行並自動化單元測試。

如要在 Firebase 控制台中快速驗證 Firebase Security Rules,請使用 Firebase 規則模擬工具