【问题标题】:Firebase Security Open AccessFirebase 安全开放访问
【发布时间】:2021-01-05 08:33:26
【问题描述】:

我的安卓壁纸应用已连接到Firebase Cloud Firestore。它没有任何用户身份验证,因为我希望用户能够毫不费力地使用它。为此,它必须处于开放访问状态,即允许用户使用readwrite。这很危险,因为如果他知道项目 ID,他还可以编辑和修改数据。项目 ID 在应用程序的 url 中可见,因此这不是一个好的选择。出于显而易见的原因,封闭式访问也不是一种选择。

在不需要用户身份验证的情况下,我可以采取什么措施来保护我的数据?我很想看到 Cloud Firestore 和 Storage 保护数据所需的代码。我希望用户只读,我作为所有者应该是唯一可以写的人。请参考所附图片。非常感谢您花时间回答我的问题。

我在 Firebase Cloud Firestore 中的数据结构:

【问题讨论】:

  • 请检查一下。我可能有不同的解释。 firebase.google.com/docs/firestore/security/insecure-rules
  • 我发布了您问题的答案。如果您澄清您的问题并添加一些详细信息(尤其是关于您的 Firebase Cloud Firestore 数据结构以及应该允许用户做什么),我可以使用一组特定的安全规则更新我的答案。
  • 我很想看看安全规则。我的 Firebase Cloud Firestore 有类别和文档。允许用户下载以及在社交媒体上分享图像。谢谢。
  • 如果您在Firebase Cloud Firestore 中显示您的数据的确切层次结构和结构,我只能在安全规则方面为您提供帮助。了解用户对每条路径的访问权限也很重要。同时,请查看下面我的回答,如果它回答了您的问题,请接受/投票。
  • 我已经接受了答案。我很抱歉我不知道我能做到这一点。如何附加图像以向您展示我的数据结构?

标签: firebase google-cloud-firestore firebase-security


【解决方案1】:

使用安全规则保护您的数据

Firebase Cloud FirestoreFirebase Realtime DatabaseFirebase Cloud Storage 受各自的安全规则保护。它们以简单而富有表现力的格式提供访问控制和数据验证,并允许您控制对数据库中文档和集合的访问。

要构建基于用户和基于角色的访问系统以确保用户数据的安全,您需要将 Firebase Authentication 与 Cloud Firestore 安全规则结合使用。

您的具体用例

我假设您将数据存储在 Firebase Cloud Firestore 中,将壁纸存储在 Firebase Cloud Storage 中。然后,用户会获得一个文档,其中包含下载壁纸的链接,并且也许还可以将自己的壁纸上传到数据库。

开放数据库的危险

正如您所提到的,允许在生产应用程序中对您的数据库进行所有读写是非常危险的。显然,任何拥有您的数据库引用的人都将能够读取或写入您的数据库中的数据。未经授权的用户可能会破坏您的后端,并且成本也有可能成倍增加。因此不建议这样做。总是应该有一些机制来防止这些情况发生。

建议:先使用匿名身份验证,然后再连接现有的身份提供者

我建议您使用Firebase Authenticationto create and use temporary anonymous accounts to authenticate with Firebase。这些临时匿名帐户可用于允许尚未注册您的应用程序的用户使用受安全规则保护的数据,同时不妨碍您的用户体验。如果匿名用户后来决定注册您的应用,您可以将他们的登录凭据链接到匿名帐户,以便他们可以在以后的会话中继续使用受保护的数据。

如果不使用常规密码身份验证,您还可以启用 Google-Sign-In、Facebook Login、Twitter、GitHub、Microsoft、Yahoo 等,让用户以非常快速和简单的方式进行身份验证,而不会影响安全性你想要什么(从用户体验的角度来看)。 FirebaseUI 可以很容易地将这些添加到您现有的应用程序中。查看有关此主题的 official documentation

实施 Cloud Firestore 安全规则

上面的official documentation 非常棒地介绍了如何开始使用 Cloud Firestore 安全规则。

但是,这些安全规则可能对您有用:

允许所有用户对 root 进行读取访问(不推荐,因为这会在生产中产生巨大的成本)。用户没有写入(创建、更新、删除)权限。在这种情况下,您可以通过 Firebase 控制台编辑您的数据。为您的项目选择选项 1 或选项 2。

rules_version = '2';

service cloud.firestore {
  match /databases/{database}/documents {
    
    // Option 1: Matches any document in the 'root' collection.
    match /root/{rumiXYZ} {
      allow read: if true;
      allow write: if false;
    }

    // Option 2: Matches any document in the 'root' collection or subcollections.
    match /root/{document=**} {
      allow read: if true;
      allow write: if false;
    }
  }
}

上述规则中的{document=**} 路径可用于匹配集合/子集合或整个数据库中的任何文档。但是,这对于您的用例来说不是必需的。继续阅读structuring security rules 的指南,了解如何匹配特定的数据路径并使用分层数据。

别忘了保护您的 Firebase 云存储!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-15
    • 2022-01-19
    • 2019-08-14
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    相关资源
    最近更新 更多