【问题标题】:Firebase Storage security read rule ignoredFirebase 存储安全读取规则被忽略
【发布时间】:2017-01-10 08:05:39
【问题描述】:

我在尝试为 Android 应用编写 Firebase 存储安全规则时遇到了一些意外行为。

为了测试一个简单的案例,我写了以下规则:

service firebase.storage {
  match /b/<my-firebase-storage-bucket>/o {
    match /{allPaths=**} {
      allow read: if request.auth.uid == "mystery";
      allow write: if request.auth.uid == "6EP13cYABCciskhKwMTaXYZHS5g1";
    }
  }
}

效果是,如果我使用授权的写入 uid -“6EP13cYABCciskhKwMTaXYZHS5g1”登录我的应用程序,我只能上传文件 - 但无论我使用哪个 uid 登录,我仍然可以读取文件。所以看起来只有写规则实际上是有效的;读取规则被忽略。

为了进一步测试,我将规则改写为:

service firebase.storage {
  match /b/<my-firebase-storage-bucket>/o {
    match /{allPaths=**} {
      allow read: if false;
      allow write: if true;
    }
  }
}

这让我可以在登录到我的应用程序时上传和读取文件:似乎只有写入规则是有效的。

谁能想到一个可能的解释?

【问题讨论】:

  • 我无法使用 9.4.0 版重现您的结果。我使用putBytes()/getBytes()Task 侦听器来检测成功和失败。对于您发布的两组规则,我可以编写但读取权限失败。您能否提供更多关于您使用什么方法进行读/写以及如何感知读取状态的详细信息?
  • @qbix - 感谢您对此的帮助。我也有 9.4.0 版。对于上传,我使用StorageReference.putFile(Uri)。这将返回一个UploadTask,我在其中添加了一个onSuccessListener。上传完成后,监听器会调用taskSnapshot.getDownloadUrl()。 Url 被发送到下载者可以访问的实时数据库中的“firebaseUri”字段。 “firebaseUri”字段中的更改会触发在FirebaseRecyclerAdapter 中对populateViewHolder() 的调用,然后使用 Glide 加载图像。图像确实加载了,因此读取一定是成功的。

标签: android firebase firebase-security firebase-storage


【解决方案1】:

您在问题下方的评论中解释说您使用getDownloadUrl() 来获取文件的URL。然后将 URL 传递给 Glide,它会读取文件。 getDownloadUrl() 的文档指出,该 URL 可用于共享文件:

异步检索具有可撤销的长期下载 URL 令牌。这可用于与他人共享文件,但也可以 如果需要,由开发人员在 Firebase 控制台中撤消。

这表明该 URL 实际上是文件的“可共享链接”,并且在使用该 URL 访问文件时,Firebase 存储中定义的安全规则不适用。可以想到许多无法应用规则的情况。例如,在 Glide 请求中使用 URL 时,请求中不包含有关请求者登录 UID 的信息,它仅包含 URL。

如果你想通过 URL 限制对文件的访问,我认为你只能通过限制对 URL 本身的访问来做到这一点。

【讨论】:

  • 好的,这很有意义。我的结论是,除了我已经为实时数据库设置的规则之外,我真的不需要为 Firebase 存储单独设置一组读取规则。相反,我只需要确保我的实时数据库规则将对相关 URL 的访问限制为适当的用户。如果这被认为是好的做法,安全方面,那么我很高兴。
猜你喜欢
  • 2021-09-21
  • 2022-01-21
  • 2021-03-31
  • 2021-01-03
  • 1970-01-01
  • 2020-07-03
  • 1970-01-01
  • 2020-03-24
相关资源
最近更新 更多