【问题标题】:How to prevent access to Firebase Realtime Database from browser console?如何防止从浏览器控制台访问 Firebase 实时数据库?
【发布时间】:2020-05-03 16:02:32
【问题描述】:

我有这个 JavaScript 代码,用户可以在其中使用他们的 google 帐户登录我的应用程序。

//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
  }
}

【问题讨论】:

  • 请张贴您的数据库规则的截图..
  • 好的,现在说吧。谁想编辑您的数据库?所有用户还是只有你?
  • 他们可以在控制台上编写的代码与他们在表单中输入相同的信息有什么区别?换句话说:什么你想防止?
  • @FrankvanPuffelen 看起来他不希望任何不受欢迎的客人编辑他的数据库。他已将规则设置为 TRUE,因此需要对其进行修改。 . .
  • @Dharmaraj 我希望通过按 google 按钮登录来创建新用户。我不希望一些随机的人从控制台进行数据库编辑。

标签: javascript firebase firebase-realtime-database firebase-authentication


【解决方案1】:

Firebase 规则是最重要的部分。 除了您之外,没有人可以编辑它们。因此,请确保它们是安全的。你有.write: true 意味着任何人都可以编写你的数据库。 为了防止这种情况发生,您应该有安全的规则。您可以查看this link 了解大多数规则组合。

看你的问题,设置规则如下:

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

确保将所有用户数据存储在不同的节点中。将节点值保留为其 UID。那么上面的规则应该很方便?

现在用户可以只编辑或阅读他们的信息。即使他们尝试通过控制台对其进行编辑,至少您可以确保其他人的安全。 如果这是一场游戏,如果你发现它们,一定要继续加罚XD。

这仍然允许用户至少编辑他们的信息,如前所述。因此,如果您要存储某种游戏统计信息以及玩家拥有多少资源,那么您需要通过执行以下操作来阻止写访问: ".write": false

现在这可能会让您感到困惑,如果写访问被拒绝,那么玩家将如何更新他们的分数或者如何将用户名添加到数据库中。

为此,您需要依赖云功能。每当新玩家创建帐户时,我都会运行一个添加默认级别和其他内容的云功能。下面是一个代码示例:

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 存在的任何规则之外,没有人可以弄乱它。如果您需要在某人完成某项特定任务时更改他们的统计信息,您只需要通过云功能来完成。很高兴所有游戏代码都在后端。

【讨论】:

  • 您的规则没有在任何地方定义 $uid 节点,因此现在检查毫无意义。
  • @FrankvanPuffelen 我在聊天讨论中向他解释过。我将把它包括在我的回答中。感谢您发现:-)
  • 感谢您的更新。这些规则要求用户使用 Firebase 身份验证登录,并且他们只能在自己的 UID 下写入数据。它不会阻止他们实际写入的数据,这就是最初的问题似乎是关于什么的。
  • @FrankvanPuffelen 就我们的讨论而言,我曾问他是否需要更多信息。一旦我知道,我会继续用所有可能性更新这个答案。要知道,我正在考虑在注册完成后将数据传输到只读节点,或者在需要时使用云功能修改数据。我也等提问者再有什么具体情况
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-30
相关资源
最近更新 更多