【问题标题】:How can I securely allow everyone to read and auth users to write to application with Firebase Realtime database?如何安全地允许每个人使用 Firebase 实时数据库读取和授权用户写入应用程序?
【发布时间】:2021-03-07 09:01:41
【问题描述】:

我正在构建一个社交媒体应用程序,任何人都可以在其中阅读正在发生的事情,但必须登录才能与每个帖子进行交互。我想找到一种方法,让我的所有用户都能够在没有不安全数据库的情况下做到这一点。我几乎完成了开发工作,目前正在尝试清理一些东西。

出于开发目的,我当前的规则设置为 true:

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

我尝试了一些规则

1.

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

允许所有人阅读但由于权限不允许写入。

2)

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

由于权限,不允许任何人读取或写入。

3.

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

这可行,但后来我收到一封电子邮件,告诉我我的数据库不安全。

以下是导致权限被拒绝错误的示例:

A) 当用户点击发送新公告按钮时 调用此函数。

 StorageService.sendAnnouncementDataToDatabase(photoUrl: "", announcementComment: announcementComment, ratio: CGFloat(0), onSuccess: {
ProgressHUD.showSuccess("SWEET")
})

B) 内部 sendAnnouncementDataToDatabase 函数

        let ref = Ref().databaseAnnouncements
        let newAnnouncementID = ref.childByAutoId().key ?? ""
        let newAnnouncementReference = ref.child(newAnnouncementID)
        guard let currentUser = Api.User.CURRENT_USER  else {
            return
        }
  
        var dict = ["userId" : currentUserId, "photoUrl" : photoUrl]
        
        newAnnouncementReference.setValue(dict, withCompletionBlock: {(error,ref) in
// permission denied occurs here
})

我已经阅读了许多文件,并堆叠了问题。以及尝试为每条路径设置规则。同样的结果。

任何想法都会有所帮助。 谢谢。

【问题讨论】:

  • 您的安全规则应该允许您的代码需要的数据访问,但拒绝任何其他数据访问。这些规则是非常通用的,所以一般会允许/拒绝。如果您想保护应用程序的数据访问模式,请显示应允许的操作和应拒绝的操作的代码。
  • @FrankvanPuffelen 我明白你在说什么。当用户在应用内时,他们真的无处可查看其他任何人的数据。尽管如此,我还是希望有一种通用的方法来简单地允许每个人都可以正确访问。我会更新我的帖子
  • 您的代码不符合 #2 中的规则,这是您共享的最安全的规则。如果您想控制对特定用户的访问,则需要在该数据的路径中使用该用户的 UID。
  • @FrankvanPuffelen 我想我明白你在说什么。该表简称为公告。所以我必须在我的路径中发布公告,然后是特定的 uid?

标签: swift firebase firebase-realtime-database firebase-authentication firebase-security


【解决方案1】:

如果这是实际目标

任何人都可以在其中阅读正在发生的事情,但必须登录 与每个帖子互动

那么这条规则就行了

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

因为它允许任何人读取任何内容,但只有经过身份验证的用户才能写入。

但是,正如弗兰克在他的 cmets 中提到的那样,这非常不安全。我们或许可以稍微扩展一下这个解决方案,但在不了解整个用例的情况下,它可能会远远超出此处可以作为完整答案发布的内容。

【讨论】:

  • 我实际上也试过这个。这是关于基本规则的firebase文档。我的邮件中仍然存在同样的不安全问题。该用例只是允许用户发布到新闻源、评论其他人的帖子并通知整个新闻源。所以我认为你提供的解决方案就足够了。它只是不安全
  • @XavierJamesShelton 这是问题的解决方案。但是,您将继续收到不安全的电子邮件,因为任何人都可以读取整个数据库中的所有数据 - 这可能是也可能是一个问题,但任何创建帐户和/或身份验证的人也可以写入任何数据。这意味着任何一个用户都可以例如欺骗另一个用户并发布虚假消息。不确定这在您的用例中是否重要,但可能。
  • 嗯,我认为这确实有帮助,我相信你说的最后一条评论是我真正需要理解的。老实说,我有很多应用程序内的安全性,只要基本上没有人可以通过读取所有内容而侵入我的数据库,我就可以了。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
  • 2018-06-08
  • 2019-09-06
  • 2020-11-22
  • 2019-07-22
  • 2023-02-13
  • 2021-12-23
相关资源
最近更新 更多