在 Firestore 中安全保存数据

2024-03-29

Firestore 文档shows https://firebase.google.com/docs/firestore/security/rules-query examples https://firebase.google.com/docs/firestore/solutions/role-based-access如何使用基于 Firestore 的安全规则来保护数据request.auth.uid场地。这些通常看起来像这样:

service cloud.firestore {
  match /databases/{database}/documents {
    match /stories/{storyid} {
      // Only the authenticated user who authored the document can read or write
      allow read, write: if request.auth.uid == resource.data.author;
    }
  }
}

这完全有道理。

我不明白(并且似乎没有在任何地方显示)是如何设置resource.data.author安全地进行现场操作。

显然,这不能仅仅基于客户端,因为任何经过身份验证的用户都可以篡改请求以将其作者设置为任何值。

我想也许我们应该使用 CloudFunctions 来设置该字段,但是目前这不起作用 https://stackoverflow.com/questions/49825566/firebase-function-context-auth-and-context-authtype-undefined/49827227#49827227.

其影响在基于角色的访问示例 https://firebase.google.com/docs/firestore/solutions/role-based-access:

{
  user: "alice",
  content: "I think this is a great story!"
}

当然,必须有一种防篡改的方法来设置用户字段——否则任何用户都可以让他们的评论看起来像是来自其他人。这看起来很糟糕。

在 Firestore 示例 Web 应用程序中,似乎设置了客户端的userId字段 https://github.com/firebase/quickstart-js/blob/master/firestore/scripts/FriendlyEats.View.js#L164我认为它正在做Android版本也一样 https://github.com/firebase/quickstart-android/blob/1791a58ffe13f364dfc1b39356ca0ec8fbf0d7f5/firestore/app/src/main/java/com/google/firebase/example/fireeats/RatingDialogFragment.java#L73.

我缺少什么?

编辑:正如 @imjared 指出的,这条规则意味着“alice”user: "alice"实际上是一个uid,所以我认为这是安全的。

我知道我错过了一些东西。

match /comments/{comment} {
  allow read: if isOneOfRoles(get(/databases/$(database)/documents/stories/$(story)),
                              ['owner', 'writer', 'commenter', 'reader']);
  allow create: if isOneOfRoles(get(/databases/$(database)/documents/stories/$(story)),
                                ['owner', 'writer', 'commenter'])
                && request.resource.data.user == request.auth.uid;

当用户将文档写入 Firebase 时,他们确实可以发送任何值author他们想要的领域。但他们没有办法设置request.auth.uid。最后一点对于确保所有(读和写)访问都得到授权至关重要。

您共享的第一个规则片段实际上有两个规则,暂时将它们分开可能会更容易:

allow read: if request.auth.uid == resource.data.author;
allow write: if request.auth.uid == resource.data.author;

The write规则仅允许操作时author请求中的具体内容与request.auth.uid. Since request.auth.uid无法被欺骗,并且其价值author仅当相同时才被接受,仅当相同时才允许写操作author字段是当前经过身份验证的用户的字段。

事实上,后一条规则更常见地写为:

allow write: if request.auth.uid == request.resource.data.author;

使用时的区别request是它明确引用了文档(resource)即在write要求。无论我们使用什么,结果都是一样的resource or request.resource,但我发现当考虑到安全性时,更容易理解安全性是如何工作的request here.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Firestore 中安全保存数据 的相关文章

  • Firebase Auth:如何检测 Firebase 尝试自动登录当前用户?

    我在用着firebase auth onAuthStateChanged 在浏览器中检测用户是否已登录 并在每个页面上加载 firebase 尝试登录当前用户 可能基于 IndexDB 中存储的令牌 我需要检测 firebase 何时尝试自
  • 如何使用 Flutter 获取 Firebase 存储目录中的所有文件

    我有一个显示夜总会描述和图像的应用程序 每个俱乐部大约有4张相关图像 在 Firebase Storage 中 我为每个俱乐部创建了目录 然后将其图像存储在其中 所以我想要做的是从俱乐部目录中获取所有图像 以便我可以在我的应用程序中显示所有
  • 将动态子项添加到我的 Firebase 参考网址

    我一直在尝试将子项动态添加到我的 firebase 数据引用 URL 但到目前为止还没有成功 假设我有以下数据结构 MyApp beta signups users fred 邮箱 电子邮件受保护 cdn cgi l email prote
  • 在 firebase 中存储空数组

    我的 firebase 应用程序与 React 一起使用 我可以注册用户 然后将信息记录到数据库中 我正在创建一个 约会应用程序 我想要某种方法来存储空数组 例如 matchers etc 我尝试过这样的事情 firebase databa
  • 删除 ChildEventListener

    我正在使用 FirebasechildEventListener被添加 N 次到Node从数据库获取数据 现在我正在尝试删除childEventListener它似乎不起作用 我得到了重复的数据 query FirebaseDatabase
  • 如何将 Firebase 身份验证与 Google 应用引擎端点集成

    我正在为移动应用程序编写一个后端服务器 后端在谷歌应用程序引擎上运行并用Java编写 我希望用户能够使用联合身份 例如 facebook 登录 我看到谷歌通过 firebase 身份验证支持移动应用程序的这种身份验证 将 firebase
  • 使用 Google Cloud 任务调用 Firestore 函数时出现“PERMISSION_DENIED:权限缺失或不足”

    我创建了一个函数 该函数向 Firestore 数据库添加一个条目 const functions require firebase functions const admin require firebase admin admin in
  • iOS Flutter 与 Firebase:启动时 FlutterAppDelegate 中出现白屏和 SIGABRT

    现在在多个项目中 非常不一致的是 我在启动应用程序时出现白屏 并且 Xcode 显示错误 Thread 1 signal SIGABRT 在线上 objc class AppDelegate FlutterAppDelegate 这些都是i
  • Firestore 作为离线持久性机制有多可靠?

    我目前使用 Firebase Firestore 作为主要后端 从各种来源检索数据 我还使用 Android 的 Room 作为我的移动后端 当手机接收到数据时 数据会存储在 Room 数据库中 以防用户几天甚至几周内不再上网 查看设备文件
  • 在 Firebase 群组消息应用中实现已读回执功能

    我想在我的 Firebase 群组消息应用中实现 Seen 功能 您能否建议采取最好 最有效的方法 工作代码将不胜感激 例如 应用程序会显示 已被 6 人看过 or 15 人看过 在群组消息中 这是我的项目 https github com
  • Firestore 安全规则:在请求上使用 hasOnly 来检查是否仅更新特定字段

    我正在设置 Firestore 安全规则 但遇到一个问题 即我想使用 hasOnly 函数限制仅更新文档中的一个特定字段 问题是我使用模拟器不断得到 拒绝 结果 我肯定做了一些简单的错误 我试图防止有人可以更新文档中的其他字段update
  • Firebase FCM 通知图像不会显示

    我在我的项目中使用 FCM 当尝试使用 firebase 撰写通知 功能测试传入通知时 我将标题 正文和图像 URL 添加到消息中 它显示了它应该是什么样子 丰富的通知与图像 但发送给我的通知是正常的 没有任何图像 这是 firebase
  • 我是否需要在我的 Firebase 项目中添加 SHA-1 指纹?

    在 Firebase 上有一个弹出窗口 显示我的项目可以添加指纹 SHA1 因为我只想使用一些 Firebase 服务 例如实时数据库 身份验证 我需要在我的项目中添加指纹吗 该图显示 仅在使用某些 Google Play 服务 如 OAu
  • Android - Firebase - 保存新数据而不覆盖旧数据

    创建此问题是因为我之前的问题包含 2 个问题 而不是将其缩小到 1 Aim 用户将能够存储新数据而不会覆盖之前提交的数据 描述 目前 当用户输入新报告时 事件报告节点中的用户事件报告数据将被覆盖 用户发送的旧事件报告中的数据应与新数据一起保
  • 无法构建 Objective-C 模块“Firebase”

    我收到此错误的原因是import Firebase 无法构建 Objective C 模块 Firebase Xcode 还抱怨 FirebaseAnalytics 说 找不到 FirebaseAnalytics FirebaseAnaly
  • 将多个身份验证提供商链接到一个帐户

    我已经实现了 Facebook 和 Google 登录 但 FireBase 文档称 如果同一用户首先使用 Facebook 注册 然后尝试使用 Google 登录 使用相同的电子邮件 这将导致错误 所以我按照文档并尝试配置帐户关联 但我不
  • 我应该开发一个单独的 Express 服务器,还是处理 next.js 应用程序中的所有 API 调用?

    我的网站将执行 CRUD 操作 并将与 MongoDB 和 Firebase 存储 身份验证配合使用 开发单独的 Express 服务器而不是将所有内容集成到我的 next js 应用程序中的原因 优势是什么 据我所知 这一切都可以在我的
  • 检查 Firebase 邀请是否引导至 Play 商店

    当在 Android 上使用 Firebase 邀请并在应用程序启动时访问动态链接时 有没有办法知道用户是通过邀请刚刚安装了该应用程序还是已经安装了该应用程序 非常感谢 Borja 编辑 感谢 Catalin Morosan 的回答 事实证
  • 如果启用持久化,当数据存在于缓存中时,什么算作读操作?

    如果监听器断开连接超过30分钟 例如 如果用户离线 您将需要支付读取费用 就好像您已经离线一样 发出了全新的查询 如果启用持久性 这仍然适用吗 情况一 App离线时间超过30分钟 启用持久性并从缓存中读取数据 从缓存中读取文档算作读操作吗
  • 接收新推送的子项的通知

    I m push ing 到 firebase 参考中 我希望听众能够上网 然后仅收到新消息的通知 push ed 孩子们 因此 如果节点已经包含 5 个子节点 并且客户端希望收到新子节点的通知 并且推送了 2 个子节点 则客户端应该只收到

随机推荐