簡體   English   中英

如何防止從瀏覽器控制台訪問 Firebase 實時數據庫?

[英]How to prevent access to Firebase Realtime Database from browser console?

我有這個 JavaScript 代碼,用戶使用他們的谷歌帳戶登錄到我的應用程序。

//firebase db congifurations
const config = {
  apiKey: "my_api_key",
  authDomain: "my-app.firebaseapp.com",
  projectId: "my-app",
  databaseURL: "https://my-app.firebaseio.com",
};

//signin callback implemented using - https://developers.google.com/identity/sign-in/web/sign-in
function onSignIn(googleUser) {
  var profile = googleUser.getBasicProfile();

  let fullName = profile.getName().split(" "); 
  let userName = profile.getEmail().replace(/@.*$/, "");

  if (!firebase.apps.length) {
    firebase.initializeApp(config);
  }
  this.database = firebase.database();

  let userRef = this.database.ref("users/" + userName);
  userRef.set({
    firstName: fullName[0],
    lastName: fullName[1],
    displayPicture: profile.getImageUrl(),
  });
}

當我執行此代碼時,將調試器放在let userRef = this.database.ref("users/" + userName); 並嘗試在控制台上運行它:

 userRef.set({
    firstName: "Clutch",
    lastName: "Prince",
    displayPicture: "any_url_that_i_want_to_inject",
  });

這個實際上被執行了,我的數據庫受到了影響。 有沒有一種安全的方法來做到這一點?

我的實時數據庫規則:

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

Firebase 規則是最重要的部分。 除了您之外,沒有人可以編輯它們。 因此,請確保它們是安全的。 你有.write: true意味着任何人都可以編寫你的數據庫。 為了防止這種情況發生,您應該有安全的規則。 您可以查看此鏈接以了解大多數規則組合。

查看您的問題,設置如下規則:

{
  "rules": {
    "Users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid" 
      }
    }
  }
}

確保將所有用戶數據存儲在不同的節點中。 將節點值保留為其 UID。 那么上面的規則應該很方便

現在用戶可以只編輯或閱讀他們的信息。 即使他們嘗試通過控制台對其進行編輯,至少您可以確保其他人的安全。 如果是游戲,請確保前面有 go,如果發現它們,則加罰 XD。

這仍然可以允許用戶至少編輯他們的信息,如前所述。 因此,如果您要存儲某種游戲統計信息以及玩家擁有多少資源,則需要通過執行以下操作來阻止寫訪問: ".write": false

現在這可能會讓您感到困惑,如果寫訪問被拒絕,那么玩家將如何更新他們的分數或者如何將用戶名添加到數據庫中。

為此,您需要依賴雲功能。 每當新玩家創建帳戶時,我都會運行雲 function,它會添加默認級別和其他內容。 下面是一個代碼示例:

export const onNewuserJoined = functions.auth.user().onCreate((user) => {
    const newUserUID = user.uid
    const newUserEmail = user.email

    return Promise.all([
    admin.database().ref(player_stats_path).set({ "Level": initLevel, "Cash": initCash}),
    admin.database().ref(player_info_path).set({ "UID": newUserUID, "E-Mail": newUserEmail})
    ])
})

現在這些player_stats_pathplayer_info_path將只有讀取訪問權限,因此除了雲功能作為OVERRIDE存在的任何規則之外,沒有人可以弄亂它。 如果您需要在某人完成某項特定任務時更改他們的統計信息,您只需要通過雲功能來完成。 很高興在后端擁有所有游戲代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM