群组的 Firebase 存储安全规则

Posted

技术标签:

【中文标题】群组的 Firebase 存储安全规则【英文标题】:Firebase Storage Security Rules for Groups 【发布时间】:2020-03-24 08:04:26 【问题描述】:

我知道对此有几个问题(例如https://***.com/a/52808572/3481904),但我仍然没有适合我的情况的解决方案。

我的应用程序有,它们是动态创建/删除的,并且可以随时添加/删除成员(用户)。

每个组有 0..N 个私有文件(Firebase 存储),保存在不同的路径中(都具有前缀 groups/groupId/...)。

在 Firestore 安全规则中,我使用 get()exists() 来了解登录用户是否属于某个组。但我不能在 Firebase 存储安全规则中执行此操作。

提出的 2 个解决方案是:

用户声明:

但需要刷新令牌(注销/登录或更新过期令牌),这对我的用例来说是不可接受的,因为用户需要在受邀后立即访问。此外,一个用户可以是许多组的一部分,这些组可能会增长超过 1000 字节。

文件元数据:

但是组可以在不同的路径中有 N 个文件,所以我需要循环列出一个组的所有文件,并在每个文件的元数据中设置组成员的用户 ID,允许访问它。当添加/删除成员时,这将是由 Firestore(Firebase 函数)触发的操作。

我不喜欢这种方法,因为:

需要循环列出 N 个文件并为每个文件设置元数据(性能不是很好) 要添加新文件,我想我需要将 create 设置为 public(因为还没有要检查的元数据),然后需要触发一个函数来将 userIds 添加到元数据中李> 授予文件访问权限可能会延迟几秒钟,如果用户在此之前打开群组页面,这可能会导致问题,体验不佳

所以,我的问题是:

    有没有更好的方法? 如果我只允许客户端在通过身份验证时访问所有文件getcreate(不允许deletelist),这是否足以保证安全?我认为恶意黑客可能会使用匿名用户上传任何内容,或者如果他们知道路径,则可能会读取所有私人群组文件......

谢谢!

【问题讨论】:

【参考方案1】:

如果自定义声明对您不起作用,那么实际上没有“好的”方法来实现它。您唯一真正的选择是:

利用 Cloud Functions 以某种方式将 Firestore 中的相关数据镜像到 Storage 中,将 Firestore 文档数据放入 Storage 对象元数据中以供规则检查。 通过您控制的后端(也可以是云功能)路由对存储的所有访问,该后端执行所有相关的安全检查。如果您使用 Cloud Functions,这不适用于内容大于 10MB 的文件,因为这是 Cloud Functions 请求和响应的大小限制。

请向 Firebase 支持提出功能请求,以允许在存储规则中使用 Firestore 文档 - 这是一个常见请求。 https://support.google.com/firebase/contact/support

【讨论】:

感谢您的快速响应!我认为选项#1 你提到它是我提到的“文件元数据”的解决方案,我解释了为什么它不适合我的情况的原因。如果我错了纠正我。选项 #2,文件可能超过 10mb,但可能性不大。有没有这方面的代码示例?我想这不是微不足道的,我可能会失去一些存储优势:/我已经提交了功能请求。再次感谢。 GitHub上有很多官方的示例。但是您可能最好使用网络搜索。 github.com/firebase/firebase-functions 我刚刚注意到,我正在为每个上传的文件添加一个 UUID 后缀以获取唯一性建议(例如groups/groupId/images/imageId/imageName-UUID.png)。如果我在安全规则中设置了不允许list,则只允许getcreate 验证用户(其余操作的Admin SDK),并且bc 路径几乎不可能粗略猜测,不会它不是一种通过默默无闻的安全形式吗?如果是这样的话,也许这对我来说就足够了,或者至少在 Firebase 对此实施新的解决方案之前是这样。除非我错过了什么……? 听起来你有一个全新的问题要单独发布。 完成:***.com/q/59110124/3481904。谢谢:)【参考方案2】:

我有类似的用例,这是另一种不使用文件元数据的方法。

    创建私有存储桶

    通过云功能上传文件到这个bucket

    2a。在这里验证组的东西,然后上传到上面的存储桶。

    2b。为上传的文件生成一个签名的 url

    2c。将此签名的 URL 放在只有组成员可以读取的 Firestore 中(例如 /groups/id/urls)

    在 UI 中,从 firestore 获取组中给定图像 ID 的签名 URL 并渲染图像。

因为我们一起生成签名 URL 和上传文件,所以使用图像不会有延迟。 (上传可能需要更长的时间,但我们可以显示微调器)

此外,我们只生成一次 URL,因此不会在每次向组中添加新成员时运行任何 B 类操作或额外函数。

如果您想更安全,您可以将签名网址的到期时间设置得很短,并定期轮换它们。

【讨论】:

以上是关于群组的 Firebase 存储安全规则的主要内容,如果未能解决你的问题,请参考以下文章

读取 Firebase 存储映像安全规则

Firebase 存储安全规则

为特定用户提供访问权限的 Firebase 存储安全规则

Firebase 存储安全规则,允许公共或所有者私有文件访问

Firebase 存储安全规则不适用于文件夹

Firebase 存储安全规则和上传文件的下载令牌