android - 忽略 Firebase 存储安全读取规则

标签 android firebase firebase-security firebase-storage

我在尝试为 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;
    }
  }
}

这允许我在登录到我的应用程序时同时上传和读取文件:再次似乎只有写入规则有效。

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

最佳答案

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

Asynchronously retrieves a long lived download URL with a revokable token. This can be used to share the file with others, but can be revoked by a developer in the Firebase Console if desired.

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

如果您想通过 URL 限制对文件的访问,我认为您只能通过限制对 URL 本身的访问来实现。

关于android - 忽略 Firebase 存储安全读取规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39288457/

相关文章:

android - 在某些 fragment 中隐藏 MenuItem

java - 为什么 BindingAdapter 必须是静态方法?

node.js - 如何从 Firestore 中的查询返回结果?

允许管理员用户读取/写入所有其他用户的 firebase 安全规则是否会造成安全漏洞?

java - TabHost 未正确加载?

java - 保存对象的属性

javascript - 将脚本 src 包含到 js 文件中

swift - 划分 UITableView 单元格 - 重复单元格

javascript - Firebase 实时数据库规则 - 允许多个用户访问列出所有消息

Firebase 数据库规则 : can't write to database