Firebase電子郵件說我的實時數據庫有不安全的規則



firebase-realtime-database firebase-authentication (1)

在這裡放火

如果電子郵件對這些規則的不安全性不是很明確,我感到很抱歉。 對於任何可用的應用程序而言,保護用戶數據的安全都是至關重要的一步,因此,我將在下面嘗試說明其工作原理。

您具有的(默認)規則允許登錄到您的後端的任何人都可以對整個數據庫進行完全讀/寫訪問。 這只是非常基本的安全層。

一方面,這比僅授予每個人訪問數據庫的權限更為安全,至少他們必須登錄。

另一方面,如果您在Firebase身份驗證中啟用了任何身份驗證提供程序,則即使沒有使用您的應用程序,任何人都可以登錄到您的後端。 取決於提供程序,這就像在瀏覽器的開發人員控制台中運行一些JavaScript一樣容易。 登錄後,便可以在您的數據庫中讀寫任何內容。 這意味著他們可以使用簡單的命令(例如 firebase.database().ref().delete() 刪除所有數據。

為了使數據訪問更加安全,您需要更嚴格地控制每個登錄用戶可以執行的操作。 例如,假設您保留一個配置文件,其中包含有關 /users 下每個用戶的信息。 您可能希望允許所有用戶訪問這些配置文件,但是您絕對只希望允許用戶修改自己的數據。 您可以使用以下規則保護它:

{
  "rules": {
    "users": {
      ".read": true,
      "$user_id": {
        // grants write access to the owner of this user account
        // whose uid must exactly match the key ($user_id)
        ".write": "$user_id === auth.uid"
      }
    }
  }
}

使用這些規則,每個人(甚至是未經身份驗證的用戶)都可以讀取所有配置文件。 但是每個配置文件只能由其配置文件的用戶修改。 有關更多信息,請參閱 有關保護用戶數據 Firebase文檔

除了確保所有對數據的訪問均得到授權之外,您還需要確保所有存儲的數據對您的應用程序所適用的任何規則均有效。 例如,假設您要為用戶存儲兩個屬性:其名稱和年齡(僅出於示例原因,實際上,您可能會存儲其出生日期)。 因此,您可以將其存儲為以下內容:

"users": {
  "uidOfPuf": {
    "name": "Frank van Puffelen",
    "age": 48
  }
}

為了確保只能寫入此數據,可以使用以下規則:

{
  "rules": {
    "users": {
      ".read": true,
      "$user_id": {
        ".write": "$user_id === auth.uid",
        ".validate": "data.hasChildren('name', 'age')",
        "name": {
          ".validate": "data.isString()",
        },
        "age: {
          ".validate": "data.isNumber()",
        },
        "$other: {
          ".validate": false
        }
      }
    }
  }
}

這些規則確保每個用戶配置文件都有一個 nameage 屬性,分別具有字符串和數字值。 如果有人嘗試寫入任何其他屬性,則寫入被拒絕。

上面是有關如何考慮保護您(用戶)數據的快速入門。 我建議您查看 Firebase安全文檔 (和嵌入式視頻)以了解更多信息。

我最近收到了來自Firebase的電子郵件,告訴我我的實時數據庫具有不安全的規則。 這些是我設定的規則:

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

這不是安全規則嗎?

電子郵件/密碼是我啟用的唯一登錄方法。





firebase-security-rules